1.理解原型设计模式以及JavaScript中的原型规则?

5.

6.可以描述new一个对象的详细过程,手动实现一个new操作符?

7.

8.function 和class区别?

9.给出执行结果并解释?

function f() {} const a = f.prototype, b = Object.getPrototypeOf(f) console.log(a === b)

结果: false


10.给出执行结果并解释?

var A = function() {}; A.prototype = {}; var a = new A(); A.prototype = {}; var b = new A();
console.log(a instanceof A) console.log(b instanceof A)

答案: false true

11.给出执行结果并解释?

function Person() { getName = function () {

  1. console.log(1)
  2. }
  3. return this;

}

Person.getName = function () {

  1. console.log(2)

}

Person.prototype.getName = function () {

  1. console.log(3)

}

var getName = function () {

  1. console.log(4)

}

function getName() {

  1. console.log(5)

}

Person.getName();

new Person.getName();

答案: 2 2

1. 面向对象OOP

面对对象是大家都很熟悉的程序设计思想,是对真实世界的抽象,目前主要OOP语言用来实现面对对象的基础是类,通过类的封装,继承来映射真实世界。
JS也是面对对象的编程语言,只不过它实现面对对象的思路是基于原型(prototype),而不是类。这种思路也叫对象关联(Object Link Other Object),即在对象上直接映射那种真实世界的关系(如继承)。

2.创建对象

(1) 当通过字面量方式创建对象时,它的原型就是Object.prototype。虽然我们无法直接访问内置属[[Prototype]],但我们可以通过Object.getPrototypeOf()或对象的proto获取对象的原型。

  1. var a = { name: 'Jack' }
  2. Object.getPrototypeOf(a) === Object.prototype; // true
  3. a.__proto__ === Object.prototype; // true

(2) 构造函数的调用(new 操作符后跟函数调用)
用构造函数生成实例对象,有一个缺点,那就是无法共享属性和方法。

  1. function Person() { this.name = 'Jack' } // 函数写法
  2. Person.prototype.sayHello = function() { alert(this.name) }
  3. class Person{ // class (ES6标准写法)
  4. constructor() {
  5. this.name = 'Jack'
  6. }
  7. sayHello = function(){
  8. alert(this.name)
  9. }
  10. }
  11. var a = new Person()
  12. a.__proto__ === Person.prototype // true

(3) Object.create()

  1. var Person = {}
  2. var a = Object.create(Person)
  3. a.__proto__ === Person // true

TIM截图20200219171239.png

3.原型的概念

JavaScript的所有对象中都包含了一个 [proto] 内部属性,这个属性所对应的就是自身的原型
JavaScript的函数对象,除了原型 [proto] 之外,还有 prototype 属性,当函数对象作为构造函数创建实例时,该 prototype 属性值将被作为实例对象的原型 [proto]

4.原型链的概念

这个概念其实也变得比较简单,可以类比类的继承链条,即每个对象的原型往上追溯,一直到Object为止,这组成了一个链条,将其中的对象串联起来,当查找当前对象的属性时,如果没找到,就会沿着这个链条去查找,一直到Object,如果还没发现,就会报undefined。那么也就意味着你的原型链不能太长,否则会出现效率问题。
TIM截图20200225224811.png

5.prototype和proto的区别

proto指向当前对象的原型,prototype是函数才具有的属性,默认情况下,new 一个函数创建出的对象,其原型都指向这个函数的prototype属性。
2e7817d676e605e54e62.png414693e5821245adeb86.png