能夠經過上述路線圖來觀察。函數
函數和對象,都有一個__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
。原型鏈