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