JS中的原型和原型鏈

為什么要理解原型和原型鏈,因?yàn)橛欣谖覀兝斫夂蛯?shí)現(xiàn) JS對(duì)象繼承薇溃。

__proto__

  • __proto__是什么

    When a constructor creates an object, that object implicitly references the constructor’s prototype property for the purpose of resolving property references. -----------ES6 文檔

    JS 中創(chuàng)建出來(lái)的對(duì)象都會(huì)有一個(gè)隱式引用,它指向的是構(gòu)造器的prototype航夺。這個(gè)隱式引用就是對(duì)象內(nèi)部[[prototype]]奥邮,通常情況下我們是無(wú)法訪(fǎng)問(wèn)到這個(gè)屬性的,但是可以通過(guò)瀏覽器實(shí)現(xiàn)的 __proto__ 屬性去訪(fǎng)問(wèn)它枫弟,每一個(gè)對(duì)象都會(huì)有一個(gè)__proto__屬性邢享。雖然可以通過(guò)__proto__ 訪(fǎng)問(wèn)到[[prototype]],但是ECMAScript 不建議通過(guò)__proto__ 去修改內(nèi)部[[prototype]] 屬性淡诗,因?yàn)檫@是個(gè)影響性能的操作骇塘。

  • __proto__指向哪里
    __proto__ 是一個(gè)引用而且指向constructor 的prototype

zhg
zhg

prototype

  • prototype 是什么伊履?
    只有函數(shù)才會(huì)有prototype 屬性。當(dāng)你創(chuàng)建一個(gè)函數(shù)時(shí)款违,它的prototype會(huì)初始化為一個(gè)"空對(duì)象" (里面含有一個(gè)constructor屬性唐瀑,它是不可枚舉屬性,近似認(rèn)為"空對(duì)象")奠货,之后就可以往里面增加屬性或方法介褥。prototype主要用于存儲(chǔ)公用的方法和屬性,然后等待實(shí)例的__proto__ 來(lái)指向它递惋。

    zhg
    zhg

原型鏈

  • 空對(duì)象toString() 方法從何而來(lái)柔滔?

    zhg

    其實(shí)上面的代碼,做了下面幾件事:

    1. 看看 obj 對(duì)象本身有沒(méi)有 toString 屬性萍虽。沒(méi)有就走到下一步睛廊。
    2. 看看 obj.__proto__ 對(duì)象有沒(méi)有 toString 屬性,發(fā)現(xiàn) obj.__proto__ 有 toString 屬性杉编,于是找到了超全。所以 obj.toString 實(shí)際上就是第 2 步中找到的 obj.__proto__.toString。
      ------知乎專(zhuān)欄:什么是 JS 原型鏈邓馒?

    由于obj.__proto__ === Object.prototype 所以obj 還可以調(diào)用Object.prototype 中其它的屬性嘶朱。可是如果obj 調(diào)用的屬性在Object.prototype 上也沒(méi)有呢光酣?那么它就會(huì)在Object.prototype.__proto__ 中尋找疏遏,又 Object.prototype.__proto__ 等同于 obj.__proto__.__proto__。所以如果在obj.__proto__.__proto__ 上也沒(méi)有找到救军,他會(huì)繼續(xù)在obj.__proto__.__proto__.__proto__ 上尋找财异,直到他找到屬性或者 .__proto__ 為null 。

    obj.__proto__.__proto__. . . . . .這樣由.__proto__組成的鏈條唱遭,就是原型鏈戳寸。 通過(guò)原型鏈,實(shí)例可以得到自身沒(méi)有但原型鏈上存在的方法或?qū)傩浴?/p>

    其實(shí)instanceof 就是利用原型鏈的特點(diǎn)來(lái)工作的拷泽。比如判斷obj 是否是Object 的實(shí)例(obj instanceof Object)疫鹊,相當(dāng)于判斷 obj.__proto__.__proto__. . . 是否等于Object.prototype

  • 原型鏈的重點(diǎn)
    __proto__prototype 之間的相互關(guān)系司致,構(gòu)成了JS 的原型鏈订晌。個(gè)人認(rèn)為掌握原型鏈,必須記住下面三句話(huà):

    • 某對(duì)象的__proto__ ===== 它構(gòu)造函數(shù)的prototype
    • Object.prototype.__proto__ ===== null
    • Function.prototype.__proto__ ===== Object.prototype
  • Function.prototype 和Obect.prototype
    Function是所有函數(shù)的原型(Function.prototype除外)蚌吸。它是對(duì)象同時(shí)又是函數(shù),所以它有__proto__prototype屬性砌庄。利用上面三句話(huà)的第一句某對(duì)象的proto===== 它構(gòu)造函數(shù)的prototype,可以得到:Function.__proto__ === Function.prototype羹唠。而Object奕枢、NumberString佩微、Array缝彬、Boolean 等構(gòu)造函數(shù)情況同Function 相差不大,所以它們都是繼承自Function哺眯,它們的__proto__ 會(huì)等于 Function.prototype谷浅。

    Function.prototype 繼承自哪里?

    typeof Function.prototype  //"function"
    Function.prototype instanceof Function  //false
    Function.prototype.prototype  //undefined
    

    由上面可以得到:Function.prototype 是一個(gè)沒(méi)有prototype屬性的函數(shù)奶卓,它不是繼承自Function一疯。

    Function.prototype instanceof Object  //true
    Function.prototype.__protot__ === Object.prototype  //true
    

    得到Function.prototype 是繼承自O(shè)bject 的。
    Object.prototype繼承自哪里?

    typeof Object.prototype  //"object"
    Object.prototype instanceof Object  //false
    Object.prototype.__proto__ === null
    

    得出Object.prototype 是一個(gè)對(duì)象夺姑,但他不是繼承自Object對(duì)象墩邀,也不是繼承自null,它是對(duì)象繼承的最頂端盏浙。

  • 總結(jié)

zhg
  • 原型圖
圖片來(lái)自網(wǎng)絡(luò)

鏈接

1眉睹、proto和prototype來(lái)深入理解JS對(duì)象和原型鏈
2、js中proto和prototype的區(qū)別和關(guān)系废膘? ---蘇墨橘的回答
3竹海、什么是 JS 原型鏈?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末丐黄,一起剝皮案震驚了整個(gè)濱河市斋配,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌孵稽,老刑警劉巖许起,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異菩鲜,居然都是意外死亡园细,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)接校,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)猛频,“玉大人,你說(shuō)我怎么就攤上這事蛛勉÷寡埃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵诽凌,是天一觀的道長(zhǎng)毡熏。 經(jīng)常有香客問(wèn)我,道長(zhǎng)侣诵,這世上最難降的妖魔是什么痢法? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任狱窘,我火速辦了婚禮,結(jié)果婚禮上财搁,老公的妹妹穿的比我還像新娘蘸炸。我一直安慰自己,他們只是感情好尖奔,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布搭儒。 她就那樣靜靜地躺著,像睡著了一般提茁。 火紅的嫁衣襯著肌膚如雪淹禾。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天甘凭,我揣著相機(jī)與錄音稀拐,去河邊找鬼。 笑死丹弱,一個(gè)胖子當(dāng)著我的面吹牛德撬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播躲胳,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蜓洪,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了坯苹?” 一聲冷哼從身側(cè)響起隆檀,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粹湃,沒(méi)想到半個(gè)月后恐仑,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡为鳄,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年裳仆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孤钦。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歧斟,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出偏形,到底是詐尸還是另有隱情静袖,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布俊扭,位于F島的核電站队橙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喘帚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一畅姊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吹由,春花似錦、人聲如沸朱嘴。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)萍嬉。三九已至乌昔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壤追,已是汗流浹背磕道。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留行冰,地道東北人溺蕉。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像悼做,于是被迫代替她去往敵國(guó)和親疯特。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容