构造函数、原型对象和实例之间的关系?
每个构造函数都有一个 prototype 属性指向原型对象,原型对象中有一个 constructor 属性指向 prototype 属性所在的函数,实例中有一个内部属性 [[Prototype]] (可用__proto__访问)指向原型对象。
ES6 extends 继承做了什么操作?
1. 把子类构造函数的原型(__proto__)指向父类构造函数
2. 把子类实例的原型对象(prototype)的原型(__proto__)指向了父类的原型对象(prototype)
3. 子类构造函数继承了父类构造函数里的属性。使用 super 调用的(ES5 则用 call 或者 apply 调用传参)。
如何设置 __proto__?
new、Object.create 和 Object.setPrototypeOf 可以设置 __proto__。
new 一个对象做了什么?
1. 创建了一个全新的对象
2. 这个对象继承了该构造函数的原型(即__proto__)
3. 构造函数中的 this 变量引用新创建的这个对象
4. 构造函数的属性和方法被加入到 this 引用的对象中
5. 如果构造函数没有返回对象类型 Object(包含 Function、Array、Date、RegExg、Error),那么 new 表达式中的函数调用会自动返回这个新的对象
Object.create(ES5 提供)
Object.create(proto, [propertiesObject]) 方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。它接收两个参数:
第一个参数是新创建对象的原型对象;
第二个参数(可选),若没有指定即为 undefined。要添加到新创建对象的可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)对象的属性描述符以及相应的属性名称。
Object.setPrototypeOf(ES6 提供)
Object.setPrototypeOf() 方法设置一个指定的对象的原型(即内部 [[Prototype]]属性)到另一个对象或 null:Object.setPrototypeOf(obj, prototype)。