JS原型與原型鏈

? JS的原型與原型鏈卿嘲,是很容易讓新手忽略的問題颂斜,相較于普通語法,它更難以理解一些拾枣,在開發(fā)上也較不常見沃疮。但這并不意為這它不重要,相反梅肤,它很重要司蔬。
?

# prototype 與 __proto__

? prototype__proto__(雙下劃線) 很容易混淆,它們之間的指向有些復雜姨蝴,避免難以理解俊啼,我們嘗試用最簡單的圖示將其說明清楚他們的區(qū)別

? 我們知道,原型本質也是一個對象左医,其他對象可以通過它實現(xiàn)屬性繼承授帕。看看一下圖


在大多數(shù)情況下浮梢,__proto__可以理解為 構造器的原型跛十,即:__proto__ === constructor.prototype (Object.create 方式除外)這里只是初步理解,不太準確秕硝,請繼續(xù)往下看

? 用代碼解釋芥映,代碼很簡單,但是希望看官自己敲一敲看看控制臺表現(xiàn)远豺,實踐了理解才更加深刻屏轰。如下:

var a = {};
console.log(a.prototype);   // undefined
console.log(a.__proto__);   // Object ()

var b = function() {
}
console.log(b.prototype);  // b {}
console.log(b.__proto__);   // function() {}
var a = {} 時的情形

? 當然,如果定義 var a = ""; 那么將輸出

> _proto_屬性指向誰

? __proto__的指向取決于對象創(chuàng)建時的實現(xiàn)方式憋飞。以下圖表列出了三種常見方式創(chuàng)建對象后霎苗,__proto__分別指向誰

  1. 字面量方式
var a = {};
console.log(a.__proto__);  // Object {}
console.log(a.__proto__ === a.constructor.prototype);   // true
  1. 構造器方式
var A = function() {};
var a = new A();
console.log(a.__proto__); // A {}
console.log(a.__proto__ === a.constructor.prototype);  // true

? 即 由構造函數(shù)A 構造出的實例函數(shù)a, 那么a的原型就是構造函數(shù)A

  1. Object.create 方式
var a1 = {};
var a2 = Object.create(a1);
console.log(a2__proto__);  // Object {a: 1}
console.log(a.__proto__ === a.constructor.prototype);  // false

(此處即為圖1中的例外情況)

# 原型鏈

? 由于__proto__是任何對象都有的屬性,而js里萬物皆對線個榛做,所以會形成一條__proto__連起來的鏈條基括, 遞歸訪問__proto__必須最終到頭裆悄,且值為null.
? 當js引擎查找對象的屬性時,縣查找對象本身是否存在該屬性,如果不存在鼓寺,會在原型鏈上查找刺桃,但不會查找自身的prototype

原型鏈關系示意圖

var A = function() {};
var a = new A();
console.log(a.__proto__);  // A {};  實例對象a的原型是構造器A的原型對象
console.log(a.__proto__.__proto__);  // Object {} 構造器A的原型是function Object的原型對象
console.log(a.__proto__.__proto__.__proto__);  // null

# 實例分析

? 在理解原型與原型鏈的概念區(qū)別信息之后儒拂,我們來看看如下案例(注意大小寫規(guī)范蹬碧,意義不一致)

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

function Mother() { }
Mother.prototype = {
  age: 18,
  home: ['Beijing']
}

Person.prototype = new Mother();

var p1 = new Person('Jack');
var p2 = new Person('Mark');
console.log(p1);    // 見下圖
console.log(p2);
console.log(p1.age);  // 18

p1對象的數(shù)據(jù)結構

? 在這個例子中, Person就是一個構造函數(shù)避凝,我們使用new創(chuàng)建了一個實例對象person舞萄。并且眨补,將這個實例對象的原型指向Mother

? 那么倒脓,在執(zhí)行console.log(p1)時撑螺,我們知道,它會先去找p1的實例屬性崎弃,在實例屬性中找不到后再去找原型屬性甘晤,最終打印出18

? p2的打印結果,與p1類似饲做,除了name屬性外

# 可能的應用場景

? 我們知道线婚,繼承了原型的原型對象之后,實例對線繼承了原型對象屬性盆均,它的值會受原型對象屬性值的修改而修改塞弊,或者我們可以理解成,實例對象的‘指針’指向了原型對象的屬性中缀踪,只是地址引用而非值引用。所以虹脯,原型對象屬性的值更改了之后驴娃,實例對象的屬性自然也跟著更改

? 假使有這樣一種場景,在一個頁面上有多個請求循集,每個請求中有多個相同的參數(shù)值唇敞,在這些參數(shù)值中,有部分的參數(shù)是受控于一個控件咒彤,及修改一個控件疆柔,多個請求需要重新發(fā)起或數(shù)據(jù)更新。

? 對于這樣的屬性镶柱,我們即可設置一個構造器旷档,并將這個共用的屬性設置在原型對象的屬性上,如果控件觸發(fā)事件改變歇拆,我們只需要修改原型鏈中的值即可鞋屈,不需要修改每個請求的參數(shù)值

# 后語

? 業(yè)精于勤荒于嬉,行成于思毀于隨.

? 勵志成長的人故觅,共勉!

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厂庇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子输吏,更是在濱河造成了極大的恐慌权旷,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贯溅,死亡現(xiàn)場離奇詭異拄氯,居然都是意外死亡躲查,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門坤邪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熙含,“玉大人,你說我怎么就攤上這事艇纺≡蹙玻” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵黔衡,是天一觀的道長蚓聘。 經(jīng)常有香客問我,道長盟劫,這世上最難降的妖魔是什么夜牡? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮侣签,結果婚禮上塘装,老公的妹妹穿的比我還像新娘。我一直安慰自己影所,他們只是感情好蹦肴,可當我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著猴娩,像睡著了一般阴幌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上卷中,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天矛双,我揣著相機與錄音,去河邊找鬼蟆豫。 笑死议忽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的十减。 我是一名探鬼主播徙瓶,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼嫉称!你這毒婦竟也來了侦镇?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤织阅,失蹤者是張志新(化名)和其女友劉穎壳繁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡闹炉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年蒿赢,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片渣触。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡羡棵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嗅钻,到底是詐尸還是另有隱情皂冰,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布养篓,位于F島的核電站秃流,受9級特大地震影響,放射性物質發(fā)生泄漏柳弄。R本人自食惡果不足惜舶胀,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望碧注。 院中可真熱鬧嚣伐,春花似錦、人聲如沸萍丐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽碉纺。三九已至船万,卻和暖如春刻撒,著一層夾襖步出監(jiān)牢的瞬間骨田,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工声怔, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留态贤,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓醋火,卻偏偏與公主長得像悠汽,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芥驳,可洞房花燭夜當晚...
    茶點故事閱讀 44,927評論 2 355

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