prototype、__proto__、constructor的关系

153 阅读1分钟

关系.png

  1. 所有函数创建时都会默认创建一个显式原型属性 prototype,它的默认值是空 Object 实例对象, prototype 中保存着该构造函数所实例化的对象们都可以找到的公有属性和方法;
  2. 每个实例对象都有一个 __proto__ 在创建实例化对象时自动添加,默认值是构造函数的 prototype,可称为隐式原型属性。
    作用是当访问一个对象的属性时,如果该对象内部不存在这个属性,就会去它的 __proto__ 属性所指向的那个对象(可以理解为原型对象,因为 new Foo() 时做了赋值 this.__proto__ = Fn.prototype )里找。如果父对象也不存在这个属性,则继续往父对象的 __proto__ 属性所指向的那个对象里找。如果还没找到,则继续往上找,直到到达原型链顶端 null。这个链条就是我们所说的原型链,而且是隐式原型链,沿着 __proto__ 去查找;
  3. f1.__proto__ 的值对应构造函数的 prototype 的值,即实例对象的隐式原型等于构造函数的显式原型;
    f1.__proto__ === Foo.prototype // true
    
  4. Object.prototype 就是顶层原型对象,它的 __proto__ 指向 null

原文链接

原型继承关系

所有的函数都有一个显式原型对象 Foo.prototype,该对象是在函数创建时默认创建的。函数本身又是一个对象 (通过 new Function 创建 )都有一个隐式原型对象 __proto__ 指向 Function.prototype
Function(){} 构造函数通过 new Function 创建,所以 __proto__ 指向自己的原型对象。所以 Function.prototypeconstructor 指向 function Function() (都是因为自己创建了自己)

原型继承关系.png