說(shuō)說(shuō)Javascript原型鏈

前言

在寫復(fù)雜的 JavaScript 應(yīng)用之前雹舀,充分理解原型鏈繼承的工作方式是每個(gè) JavaScript 程序員必修的功課虚吟。

JavaScript中并沒有類(class)邦鲫;Js是基于原型(prototype-based)來(lái)實(shí)現(xiàn)的面向?qū)ο螅∣OP)的編程范式的庆捺,但并不是所有的對(duì)象都擁有prototype這一屬性

var a = {},b = 'shi';

var fn = function(){};

a.prototype // undefined

b.prototype // undefined

fn.prototype  // Object {constructor: function}

prototype屬性只有 function對(duì)象定義時(shí)才有,函數(shù)本身也是對(duì)象。想要明白原型問(wèn)題我們先明白幾個(gè)基本概念撬即。

一、function粒竖、Function蕊苗、Object和{}

function是JavaScript的關(guān)鍵字朽砰,用于定義函數(shù)變量瞧柔,一般有2種定義方式

function f1(){  
   console.log('This is function f1!');
}
typeof(f1);  //=> 'function'

var f2 = function(){  
  console.log('This is function f2!');
}
typeof(f2);  //=> 'function'  

Function是函數(shù)類型實(shí)例的構(gòu)造函數(shù)(constructor), 本質(zhì)也是函數(shù)撼唾,類似還有ObjectString券坞、Number等,都是Js內(nèi)置類型實(shí)例的構(gòu)造函數(shù)倍靡,構(gòu)造函數(shù)主要作用就是創(chuàng)建相應(yīng)類型的實(shí)例,實(shí)現(xiàn)原型鏈捡需。

var f3 = new Function("console.log('This is function f3!');");  
f3();        //=> 'This is function f3!'  
typeof(f3);  //=> 'function'

typeof(Function); //=> 'function'  

Object,它用于生成對(duì)象類型饰剥,其簡(jiǎn)寫形式為{},其實(shí)和function和Function的關(guān)系類似顾孽。

var o1 = new Object();  
typeof(o1);      //=> 'object'

var o2 = {};  
typeof(o2);     //=> 'object'

typeof(Object); //=> 'function'  

二、prototype 和 _proto_

prototype屬性只有函數(shù)類型對(duì)象才有,上面說(shuō)的很清楚了。而__proto__是所有JavaScript對(duì)象都內(nèi)置的屬性[[Prototype]]锚贱,而這個(gè)屬性指向構(gòu)造函數(shù)(類似父類)的prototype屬性,從而繼承屬性.

舉個(gè)例子:

var Person = function(){};  
Person.prototype.type = 'Person';  
Person.prototype.maxAge = 100;

var p = new Person();  
console.log(p.maxAge);  
p.name = 'rainy';

// 修正Person.prototype.constructor為Person本身
Person.prototype.constructor === Person;  //=> true  
p.__proto__ === Person.prototype;         //=> true  
console.log(p.prototype);                 //=> undefined  

一圖勝千言

Markdown

Person是一個(gè)函數(shù)類型的變量关串,因此自帶了prototype屬性拧廊,prototype屬性中的constructor又指向Person本身;通過(guò)new關(guān)鍵字生成的Person類的實(shí)例p1晋修,通過(guò)__proto__屬性指向了Person的原型吧碾。

注意:
遵循ECMAScript標(biāo)準(zhǔn),someObject.[[Prototype]] 符號(hào)是用于指派 someObject 的原型墓卦。這個(gè)等同于 JavaScript 的 __proto__ 屬性倦春。從 ECMAScript 6 開始, [[Prototype]] 可以用Object.getPrototypeOf()和Object.setPrototypeOf()訪問(wèn)器來(lái)訪問(wèn)。

三落剪、原型鏈

原型鏈?zhǔn)腔?__proto__ 的睁本。JavaScript 對(duì)象有一個(gè)指向一個(gè)原型對(duì)象的鏈。當(dāng)試圖訪問(wèn)一個(gè)對(duì)象的屬性時(shí)忠怖,它不僅僅在該對(duì)象上搜尋呢堰,還會(huì)搜尋該對(duì)象的原型,以及該對(duì)象的原型的原型凡泣,依此層層向上搜索枉疼,直到找到一個(gè)名字匹配的屬性或到達(dá)原型鏈的末尾。

舉例說(shuō)明:

// Node
var Obj = function(){};  
var o = new Obj();  
o.__proto__ === Obj.prototype;  //=> true  
o.__proto__.constructor === Obj; //=> true

Obj.__proto__ === Function.prototype; //=> true  
Obj.__proto__.constructor === Function; //=> true

Function.__proto__ === Function.prototype; //=> true  
Object.__proto__ === Object.prototype;     //=> false  
Object.__proto__ === Function.prototype;   //=> true

Function.__proto__.constructor === Function;//=> true  
Function.__proto__.__proto__;               //=> {}  
Function.__proto__.__proto__ === o.__proto__.__proto__; //=> true  
o.__proto__.__proto__.__proto__ === null;   //=> true  

來(lái)張圖更直觀一些

Markdown

到了這里问麸,其實(shí)有個(gè)問(wèn)題大家沒注意往衷,new關(guān)鍵詞到底起了什么作用呢?

其實(shí)開頭的圖已經(jīng)給出答案:new關(guān)鍵詞的最主要的作用就是完成上圖所示實(shí)例與父類原型之間關(guān)系的串接严卖,并創(chuàng)建一個(gè)新的對(duì)象.

有興趣深入看這里:JS 的 new 到底是干什么的席舍?

文筆有限,才疏學(xué)淺哮笆,文中若有不對(duì)之處来颤,還望告知汰扭。
個(gè)人博客


參考文章

  1. 繼承與原型鏈

  2. 原型

  3. 圖解Javascript原型鏈

  4. 關(guān)于js中,原型對(duì)象,原型鏈福铅,構(gòu)造函數(shù)萝毛,實(shí)例之間關(guān)系的理解與區(qū)別

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市滑黔,隨后出現(xiàn)的幾起案子笆包,更是在濱河造成了極大的恐慌,老刑警劉巖略荡,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件庵佣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡汛兜,警方通過(guò)查閱死者的電腦和手機(jī)巴粪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粥谬,“玉大人肛根,你說(shuō)我怎么就攤上這事÷┎撸” “怎么了派哲?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)掺喻。 經(jīng)常有香客問(wèn)我狮辽,道長(zhǎng),這世上最難降的妖魔是什么巢寡? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮椰苟,結(jié)果婚禮上抑月,老公的妹妹穿的比我還像新娘。我一直安慰自己舆蝴,他們只是感情好谦絮,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著洁仗,像睡著了一般层皱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赠潦,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天叫胖,我揣著相機(jī)與錄音,去河邊找鬼她奥。 笑死瓮增,一個(gè)胖子當(dāng)著我的面吹牛怎棱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播绷跑,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼拳恋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了砸捏?” 一聲冷哼從身側(cè)響起谬运,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎垦藏,沒想到半個(gè)月后梆暖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膝藕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年式廷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芭挽。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡滑废,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出袜爪,到底是詐尸還是另有隱情蠕趁,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布辛馆,位于F島的核電站俺陋,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏昙篙。R本人自食惡果不足惜腊状,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望苔可。 院中可真熱鬧缴挖,春花似錦、人聲如沸焚辅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)同蜻。三九已至棚点,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間湾蔓,已是汗流浹背瘫析。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人颁股。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓么库,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親甘有。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诉儒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

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

  • 在JavaScript中,原型鏈作為一個(gè)基礎(chǔ)亏掀,老生長(zhǎng)談忱反,今天我們就來(lái)深入的解讀一下原型鏈。 本章主要講的是下面幾點(diǎn)...
    Devinnn閱讀 1,398評(píng)論 1 6
  • 原型鏈?zhǔn)且环N機(jī)制滤愕,指的是 JavaScript 每個(gè)對(duì)象都有一個(gè)內(nèi)置的 __proto__ 屬性指向創(chuàng)建它的構(gòu)造函...
    劼哥stone閱讀 4,402評(píng)論 15 80
  • 理解 javascript 的原型鏈及繼承 以上所有的運(yùn)行結(jié)果都是 true; 三種構(gòu)造對(duì)象的方法: 通過(guò)對(duì)象字面...
    你期待的花開閱讀 1,500評(píng)論 0 3
  • 歌里問(wèn):“是不是 對(duì)生活不太滿意间影,很久沒有笑過(guò)注竿,又不知為何” 那么“既然不快樂,又不喜歡這里魂贬,不如一路向西巩割,去大理...
    三天龜閱讀 583評(píng)論 1 2
  • 周末回老家溜達(dá),坐在巷口發(fā)呆付燥,鄰居老婆婆一個(gè)人在陰暗的房間里轉(zhuǎn)過(guò)來(lái)轉(zhuǎn)過(guò)去宣谈,雙手不停的抖著,嘴里念叨著什么键科,好像要...
    雙魚座傳說(shuō)閱讀 294評(píng)論 0 2