const fn = function(){}; // 自动带prototype属性,是一个具有constructor(指向自身)属性的对象
fn.__proto__ === Function.prototype; // true
fn.prototype !== fn.__proto__; // true
fn.prototype !== Funtion.prototype; // true
fn.prototype.constructor === fn; // true
new fn().constructor === fn; // true
fn.constructor === Function; // true (实例的constructor指向实例对应的类)
class Space {
constructor(){}
}
Space.__proto__ === Function.prototype; // true
Space.prototype !== Space.__proto__; // true
Space.prototype !== Funtion.prototype; // true
Space.prototype.constructor === Space; // true , 类自动带prototype属性,是一个具有constructor(指向自身)属性的对象
new Space().constructor === Space; // true
Space.constructor === Function; // true
const obj = {};
obj.constructor === Object; // true
// prototype原型对象的constructor指向类本身,因此
// 实例(对象)继承constructor属性,也指向对应的类本身,实例具有__proto__访问器属性(弃用不推荐)指向类(绑定的)原型
// 类名.constructor和类定义中的constructor不是一回事(类是构造函数语法糖)
// 类名(函数名).prototype是指类或函数被作为构造器时分配给其实例对象的原型,类名.__proto__(或 [[Prototype]] )是指作为一个实例对象本身的原型
大话原型链
prototype如同丈夫,constructor如同妻子(或母亲),__proto__如同父亲。
每个function声明后,会自动绑定一个prototype的空丈夫(Object的实例),等到成家时会修改prototype指向真正的丈夫。每个实例对象未成家时,constructor指向母亲,等到成家后constructor指向妻子,__proto__一直指向父亲。Object就像女娲,Object.prototype就像伏羲。
class A extends B ,BA就像是婆媳关系。A的丈夫(prototype)是B的儿子,丈夫(B的儿子)的constructor指向妻子A,丈夫的__proto__指向其父亲(B的丈夫-B.prototype)。