总结一下原型链里的一些基本概念:
首先我们要明确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__
|
|
最后贴一张图: