[[Prototype]]、prototype、costructor的理解

[[Prototype]] 可以理解為 prototype linkage(原型連接),是一種Javascript語言的機(jī)制。
prototype、constructor是某些對(duì)象上的屬性。

接下來可以通過一個(gè)函數(shù)開始理解

function Foo(name){
    this.name = name;
}

Javascript內(nèi)部會(huì)創(chuàng)建一個(gè)Foo function, 該 Foo 會(huì)有一個(gè)prototype的屬性(所有的函數(shù)都會(huì)擁有一個(gè)名為prototype的公有并且不可枚舉的屬性),Foo.prototype會(huì)指向一個(gè)匿名對(duì)象,這個(gè)對(duì)象默認(rèn)會(huì)有一個(gè)constructor屬性,這個(gè)屬性引用的是對(duì)象關(guān)聯(lián)的函數(shù),這個(gè)對(duì)象關(guān)聯(lián)的函數(shù)就是Foo。所以 Foo.prototype.constructor===Foo 的結(jié)果為true。

pic0.PNG

每一個(gè)普通對(duì)象都有內(nèi)置的Object.prototype,指向原型鏈的頂端。像toString()、valueOf()...這些方法都存在于Object.prototype對(duì)象上,因此語言中所有對(duì)象都可以使用它們。


pic1.PNG

Foo 函數(shù)也是對(duì)象,所以它Foo.prototype所指向的那個(gè)對(duì)象也會(huì)關(guān)聯(lián)到Object.prototype,這個(gè)就是所謂的原型鏈的最頂端。(原型鏈下面會(huì)解釋)

pic2.PNG
接下來再看一下代碼
Foo.prototype.whoIam(){
  return "I am "+ this.name;
}

var a = new Foo('chen');
a.whoIam(); // 'I am chen'

new Foo() 會(huì)生成一個(gè)新對(duì)象,稱為a,這對(duì)象的內(nèi)部鏈接[[Prototype]]會(huì)關(guān)聯(lián)到 Foo.prototype上。實(shí)際上a并沒有whoIam,它會(huì)通過委托再Foo.prototype上找到。a對(duì)象為什么會(huì)有name屬性,通過this的綁定得到的(Foo function 里的 this.name=name

那么其實(shí)就是在第一個(gè)對(duì)象上沒有找到需要的屬性或者方法引用,引擎就會(huì)繼續(xù)在[[Prototype]]關(guān)聯(lián)的對(duì)象上進(jìn)行查找。同理后者也沒有找到需要的屬性或者方法引用就會(huì)繼續(xù)查找它[[Prototype]]關(guān)聯(lián)的對(duì)象上進(jìn)行查找,如果一直找不到,最終查找到Object.prototype對(duì)象上。這一系列的行為就是所謂的原型鏈。

pic4.PNG

看完上面的圖之后就可以更好的理解下來的代碼了

a.constructor === Foo.prototype.constructor // true
a.constructor === Foo //true

實(shí)際上a 并沒有 constructor這個(gè)屬性,是a 通過[[Prototype]]關(guān)聯(lián)到了 Foo.prototype上,而Foo.prototype 上有constructor這個(gè)屬性,然后Foo.prototype.constructor引用的是Foo。

那么創(chuàng)建一個(gè)普通的a對(duì)象也是一樣的

var a = {};
a.constructor===Object.prototype.constructor //true
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持,譯者再次奉上一點(diǎn)點(diǎn)福利:阿里云產(chǎn)品券,享受所有官網(wǎng)優(yōu)惠,并抽取幸運(yùn)大...
    HetfieldJoe閱讀 3,076評(píng)論 4 14
  • 特別說明,為便于查閱,文章轉(zhuǎn)自https://github.com/getify/You-Dont-Know-JS...
    殺破狼real閱讀 1,244評(píng)論 0 4
  • 結(jié)婚快四年了,已然厭倦了婚后的兩地分居,亦讓我失落至極! 怨,見不到你! 怨,摸不著邊! 怨,無處訴說! 如果我們...
    婉言1228閱讀 414評(píng)論 0 0
  • 喜歡你,是陳奕迅,是權(quán)律二,是可愛多,是每個(gè)日出日落,是往后余生,是每句早安晚安呀。
    石阿柚閱讀 161評(píng)論 0 0
  • 青春,一半明媚,一半憂傷。它是一本驚天地泣鬼神的著作,而我們卻讀地太匆忙。 每個(gè)人在未成年的時(shí)候都有個(gè)長大的夢(mèng),可...
    怡南閱讀 732評(píng)論 0 7

友情鏈接更多精彩內(nèi)容