总结一下原型链里的一些基本概念:
首先我们要明确prototype和__proto__:
每个函数都有一个原型对象属性:
prototype,它包含两个成员属性:constructor&__proto__每个对象都有一个隐藏的
__proto__属性,它引用了创建该对象的函数的prototype,即:foo.__proto__ === Foo.prototype,这里的__proto__成为”隐式原型”。
自定义函数的prototype
我们已经说过自定义函数都有一个原型对象属性,那 Foo.prototype就应该也有__proto__属性才对,那它的__proto__又是什么呢?
|
|
自定义函数Foo的prototype本质上跟var obj= {}一样都是被Object创建的,所以它的__proto__指向Object.prototype
自定义函数的__proto__
自定义函数也是一种对象呀,所以它肯定也有__proto__属性:
|
|
为什么呢?想想一般我们怎么创建函数:
|
|
可以看出,函数Foo是被Function创建出来的,所以Foo的__proto__指向Function的prototype
同理:
|
|
Object.prototype
再看一个例子:
|
|
同样,Object.prototype也是一个对象,那么它的__proto__对象又是什么呢?
这里需要注意的是:Object.prototype的__proto__指向的是null
Object的__proto__
|
|
最后贴一张图:
