可以通过上述路线图来观察。
函数和对象,都有一个
__proto__
属性,指向它们各自的原型prototype
。注意到prototype
也是一个对象,所以prototype
也有__proto__
属性,这样就构成了一个原型链,最高到达Object.prototype.__proto__===null
为止。对于函数而言,它的
__proto__
指向Function.prototype
。因为Object
和Function
本身也是函数,所以Function.__proto__、Object.__proto__、Cat.__proto__
实际上是完全相同的,它们都指向同一个对象:Function.prototype
。因此,如果我们有:
Function.prototype.bark=function(){console.log("Wow!")}
,那么所有函数都可以按照原型链访问到该方法:Cat.bark()
。注意不能写成Function.bark=....
,否则需要通过:Cat.constructor.bark()
来访问(Cat
通过原型链在Function
的prototype
中找到了constructor
,而它指向Function
,从而可以引用bark
)由
Cat
这个自定义函数可知,当函数被编译创建时它就已经有了一个原型对象prototype
。而这个原型对象prototype
本身不等于Object.prototype
,而是它的__proto__
属性等于:Cat.prototype.__proto__===Object.prototype
当我们手动改变一个对象的原型时(即改变
__proto__
指向),注意constructor
。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。