JavaScript:__proto__和prototype的關係

路線圖

能夠經過上述路線圖來觀察。函數

  • 函數和對象,都有一個__proto__屬性,指向它們各自的原型prototype。注意到prototype也是一個對象,因此prototype也有__proto__屬性,這樣就構成了一個原型鏈,最高到達Object.prototype.__proto__===null爲止。spa

  • 對於函數而言,它的__proto__指向Function.prototype。由於ObjectFunction自己也是函數,因此Function.__proto__、Object.__proto__、Cat.__proto__其實是徹底相同的,它們都指向同一個對象:Function.prototypeprototype

  • 所以,若是咱們有:Function.prototype.bark=function(){console.log("Wow!")},那麼全部函數均可以按照原型鏈訪問到該方法:Cat.bark()。注意不能寫成Function.bark=....,不然須要經過:Cat.constructor.bark()來訪問(Cat經過原型鏈在Functionprototype中找到了constructor,而它指向Function,從而能夠引用barkcode

  • Cat這個自定義函數可知,當函數被編譯建立時它就已經有了一個原型對象prototype。而這個原型對象prototype自己不等於Object.prototype,而是它的__proto__屬性等於:Cat.prototype.__proto__===Object.prototype對象

  • 當咱們手動改變一個對象的原型時(即改變__proto__指向),注意constructor原型鏈

相關文章
相關標籤/搜索