能够经过上述路线图来观察。函数
函数和对象,都有一个__proto__
属性,指向它们各自的原型prototype
。注意到prototype
也是一个对象,因此prototype
也有__proto__
属性,这样就构成了一个原型链,最高到达Object.prototype.__proto__===null
为止。spa
对于函数而言,它的__proto__
指向Function.prototype
。由于Object
和Function
自己也是函数,因此Function.__proto__、Object.__proto__、Cat.__proto__
其实是彻底相同的,它们都指向同一个对象:Function.prototype
。prototype
所以,若是咱们有:Function.prototype.bark=function(){console.log("Wow!")}
,那么全部函数均可以按照原型链访问到该方法:Cat.bark()
。注意不能写成Function.bark=....
,不然须要经过:Cat.constructor.bark()
来访问(Cat
经过原型链在Function
的prototype
中找到了constructor
,而它指向Function
,从而能够引用bark
)code
由Cat
这个自定义函数可知,当函数被编译建立时它就已经有了一个原型对象prototype
。而这个原型对象prototype
自己不等于Object.prototype
,而是它的__proto__
属性等于:Cat.prototype.__proto__===Object.prototype
对象
当咱们手动改变一个对象的原型时(即改变__proto__
指向),注意constructor
。原型链