javascript之原型鏈詳解

對象著手

在談原型鏈之前如捅,先了解對象,萬物皆對象调煎。
  • 所有引用類型(函數(shù)镜遣,數(shù)組,對象)都擁有proto屬性(隱式原型)

  • 所有函數(shù)擁有prototype屬性(顯式原型)(僅限函數(shù))

  • 原型對象:擁有prototype屬性的對象士袄,在定義函數(shù)時就被創(chuàng)建

prototype與proto兩個概念

  • prototype:此屬性只有構造函數(shù)才有悲关,它指向的是當前構造函數(shù)的原型對象。
  • proto:此屬性是任何對象在創(chuàng)建時都會有的一個屬性娄柳,它指向了產生當前對象的構造函數(shù)的原型對象寓辱,由于并非標準規(guī)定屬性,不要隨便去更改這個屬性的值赤拒,以免破壞原型鏈秫筏,但是可以借助這個屬性來學習诱鞠,所謂的原型鏈就是由proto連接而成的鏈。

原型鏈詳解

在js代碼中
通過對象創(chuàng)建(下面一段簡單的代碼)詳細分析原型鏈
一段簡單代碼:

function foo(){}
foo.prototype.z=3;

var obj=new foo();
obj.y=2;
obj.x=1;

//調用
obj.x;//1
obj.y;//2

obj.z;//3

typeof obj.toString;//'function'
'z' in obj;//true
obj.hasOwnProperty('z');//false

obj.z=5;
obj.z;//5
'z' in obj;//true
obj.hasOwnProperty('z');//true
foo.prototype.z;//3
  • 代碼簡單分析

    上面一段代碼跳昼,聲明第一個函數(shù)foo的時候般甲,它就會帶一個foo.prototype的屬性肋乍,這個屬性是一個對象屬性鹅颊,用new foo();構造器的方式構造一個新的對象obj。這時候這個obj的原型會指向foo的prototype屬性墓造。 對于這個foo函數(shù)的原型也會指向Object.prototype,這個Object.prototype也是有原型的堪伍,它的原型指向null。

  • 代碼對象原型鏈圖:

[圖片上傳失敗...(image-9f8e1d-1559386395923)]

  • 對象訪問屬性順序

    對象訪問屬性的順序觅闽,是采用向上查找帝雇,如果當前對象沒有,它會一直向上原型鏈中查找蛉拙,一直找到null尸闸,如果還沒有會返回undefind。

  • 對象中值修改說明

    代碼中修改obj.z的值后孕锄,再次輸出obj.z的時候是5,foo.prototype.z是3吮廉,說明我們在修改或添加對象的屬性的時候,只是修改了對象本身obj.prototype.z中的值畸肆,而原型鏈中foo.prototype.z的值并不會修改宦芦。

  • in,hasOwnProperty等方法的出現(xiàn)

    首先查看整個原型鏈轴脐,會想這兩個方法是怎么來的调卑,在foo的的proto指向上一級Object.prototype的時候,就可以訪問Object中的一些函數(shù)和屬性了大咱,其中就包括這兩個方法恬涧。

    第一次調用

    'z' in obj;//true  
    obj.hasOwnProperty('z');//false
    

    表示的是z并不是obj這個對象上的,而是對象的原型鏈上的碴巾。

     'z' in obj;//true
      obj.hasOwnProperty('z');//true
      foo.prototype.z;//3
    

    第二次修改了obj.z的值气破,z就是obj這個對象上的了,但是也并沒有修改原型鏈中的z的值餐抢。

特殊說明

proto是每一個對象都有的屬性现使,它的指向會有一個特殊說明,大多數(shù)情況下 proto指向了產生當前對象的構造函數(shù)的原型對象旷痕,也就是那個 prototype碳锈。但是會有特殊的情況

  • 特殊情況
 var a={};
 var b=Object.create(a);

object.create是創(chuàng)建了一個空對象,空對象的原型指向a欺抗,a也是空對象售碳,這其中不存在prototype;Object.create在繼承中也常被使用,創(chuàng)建一個空對象指向()內的對象,這這樣實現(xiàn)了b繼承a贸人,也不會篡改a中的內容间景,在這里就不具體說明了。

原理圖分析

image

總結

  • 到底什么是原型鏈?

    proto是任何對象都有的屬性艺智,在js中萬物皆對象倘要,所以會形成一條proto連起來的鏈條,遞歸訪問proto必須最終到頭十拣,并且值是null封拧。

<center>覺得本文對你有幫助?請分享給更多人<center>

我的公眾號.jpg

歡迎大家關注我的公眾號——程序員成長指北夭问。請自行微信搜索——“程序員成長指北”

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末泽西,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缰趋,更是在濱河造成了極大的恐慌捧杉,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秘血,死亡現(xiàn)場離奇詭異味抖,居然都是意外死亡,警方通過查閱死者的電腦和手機直撤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門非竿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谋竖,你說我怎么就攤上這事红柱。” “怎么了蓖乘?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵锤悄,是天一觀的道長。 經常有香客問我嘉抒,道長零聚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任些侍,我火速辦了婚禮隶症,結果婚禮上,老公的妹妹穿的比我還像新娘岗宣。我一直安慰自己蚂会,他們只是感情好,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布耗式。 她就那樣靜靜地躺著胁住,像睡著了一般趁猴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上彪见,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天儡司,我揣著相機與錄音,去河邊找鬼余指。 笑死捕犬,一個胖子當著我的面吹牛,可吹牛的內容都是我干的浪规。 我是一名探鬼主播或听,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼探孝,長吁一口氣:“原來是場噩夢啊……” “哼笋婿!你這毒婦竟也來了?” 一聲冷哼從身側響起顿颅,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤缸濒,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后粱腻,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體庇配,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年绍些,在試婚紗的時候發(fā)現(xiàn)自己被綠了捞慌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡柬批,死狀恐怖啸澡,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情氮帐,我是刑警寧澤嗅虏,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站上沐,受9級特大地震影響皮服,放射性物質發(fā)生泄漏。R本人自食惡果不足惜参咙,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一龄广、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蕴侧,春花似錦择同、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谆刨。三九已至,卻和暖如春归斤,著一層夾襖步出監(jiān)牢的瞬間痊夭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工脏里, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留她我,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓迫横,卻偏偏與公主長得像番舆,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子矾踱,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內容