Web前端------JS原型恢筝、原型鏈詳解

轉(zhuǎn)載至: JS原型鏈詳解
JS是基于對象的語言气嫁,原型對象是其模擬面向?qū)ο蟮囊环N方式,關(guān)于原型有兩種表現(xiàn)形式:一種是proto (隱式原型) 一種是prototype(顯式原型)耍属,這兩個名詞形成了原型鏈的愛恨情仇。

下面我們看下這兩個原型出自哪里巩检,比較重要

20180117175625876.png
20180117175938042.png
20180117192849064.png
下面的圖片是從知乎上面弄下來的祖?zhèn)骼蠄D厚骗,被我挖過來了
20180117174025900.png

下面總(chao)結(jié)(xi)了幾條原型的概念,然后就不難理解上面的這幅圖了
1 . 任何對象都擁有 proto(隱式原型) 屬性, 一般指向他們的構(gòu)造函數(shù)的原型 (prototype) .

var a = new Array () 
// a 是一個數(shù)組對象 默認擁有__proto__ 屬性 
console.log(a.__proto__ === Array.prototype);  // true

2 . 原型鏈的頂端是Object.prototype兢哭,其 proto為 null

console.log(Object.prototype.__proto__ === null); // true

3 . 所有函數(shù)都擁有prototype (顯式原型)屬性
同最上面的圖领舰,實例(對象/構(gòu)造函數(shù)new 出來的東西)存在proto,函數(shù)/方法存在prototype(萬物皆對象,也存在proto,指向下面的Function)

4 . 所有函數(shù)都是Function 的 實例

function fn () { 
}
// fn 是 Function 構(gòu)造函數(shù)創(chuàng)建出來的 
console.log(fn.__proto__ === Function.prototype);  // true
console.log(obj.__proto__ === Object.prototype); // true
console.log(arr.__proto__ === Array.prototype);    // true 

5 . Object Function Array 本身也都是一個函數(shù)迟螺,由于是最常用的冲秽,所以JavaScript幫我們實現(xiàn)了

// 當我們通過構(gòu)造函數(shù)的方式來創(chuàng)建一個對象 ,其本質(zhì)也是new一個普通的函數(shù)
// 因此可以得出
console.log(Function.__proto__ === Function.prototype); // true
console.log(Object.__proto__ === Function.prototype );  // true
console.log(Array.__proto__ === Function.prototype);    // true

6 . 原型對象中又擁有constructor屬性,該屬性指向函數(shù)本身,這個好理解(constructor為構(gòu)造器矩父,不修改的情況下prototype.constructor等于自己)

console.log(Function.prototype.constructor === Function); // true
console.log(Object.prototype.constructor === Object);     // true
console.log(Array.prototype.constructor === Array);       // true

7 . 原型鏈 概念
如果想要找到一個對象的屬性,首先會先在自身查找,如果沒有,就會通過proto屬性一層層的向上查找,直到原型鏈的頂端 Object.prototype(proto: null)锉桑,這種通過某種紐帶(proto)將對象之間形成一種繼承關(guān)系 這種關(guān)系呈現(xiàn)出一種鏈條的形狀 將這種鏈條稱之為原型鏈

function foo(name) {
   this.name = name;
}
foo.prototype = {
    showName: function() {console.log(this.name)}
}

var zyc = new foo('zyc');
zyc.showName = function(){ console.log('superMan') };
zyc.showName();     // superMan

// 刪除了本身屬性,查構(gòu)造函數(shù)的prototype窍株,不行再去查Object和Function的prototype
delete zyc.showName; 
zyc.showName();    // zyc

8 . 根據(jù)第 6 條可以推論得:

console.log(fn.constructor===Function); // true 
// fn自身并沒有constructor屬性,所以他會順著原型鏈向上找
// fn.__proto__ 指向的是 Function.prototype 見第4
// Function.prototype.constructor  === Function
console.log(Function.constructor === Function); // true
console.log(Object.constructor === Function);   //true

9 . Function.prototype.proto === Object.prototype
Function是一個特殊的例子 他創(chuàng)造了所有的函數(shù),但他自身就是也是一個函數(shù) 總不能自己創(chuàng)造自己吧 所以他的上級是 Object.prototype

參考資料:
繼承與原型鏈
JS原型鏈圖解教程
圖文并茂深入淺出完全理解JavaScript原型

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末民轴,一起剝皮案震驚了整個濱河市攻柠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌后裸,老刑警劉巖瑰钮,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異微驶,居然都是意外死亡浪谴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門因苹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苟耻,“玉大人,你說我怎么就攤上這事容燕×撼剩” “怎么了婚度?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵蘸秘,是天一觀的道長。 經(jīng)常有香客問我蝗茁,道長醋虏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任哮翘,我火速辦了婚禮颈嚼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘饭寺。我一直安慰自己阻课,他們只是感情好,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布艰匙。 她就那樣靜靜地躺著限煞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪员凝。 梳的紋絲不亂的頭發(fā)上署驻,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天,我揣著相機與錄音健霹,去河邊找鬼旺上。 笑死,一個胖子當著我的面吹牛糖埋,可吹牛的內(nèi)容都是我干的宣吱。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼瞳别,長吁一口氣:“原來是場噩夢啊……” “哼征候!你這毒婦竟也來了钦听?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤倍奢,失蹤者是張志新(化名)和其女友劉穎朴上,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體卒煞,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡痪宰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了畔裕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衣撬。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖扮饶,靈堂內(nèi)的尸體忽然破棺而出具练,到底是詐尸還是另有隱情,我是刑警寧澤甜无,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布扛点,位于F島的核電站,受9級特大地震影響岂丘,放射性物質(zhì)發(fā)生泄漏陵究。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一奥帘、第九天 我趴在偏房一處隱蔽的房頂上張望铜邮。 院中可真熱鬧,春花似錦寨蹋、人聲如沸松蒜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秸苗。三九已至,卻和暖如春评姨,著一層夾襖步出監(jiān)牢的瞬間难述,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工吐句, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胁后,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓嗦枢,卻偏偏與公主長得像攀芯,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子文虏,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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

  • JS中原型鏈侣诺,說簡單也簡單殖演。 首先明確: 函數(shù)(Function)才有prototype屬性,對象(除Object...
    前小白閱讀 3,907評論 0 9
  • 官方中文版原文鏈接 感謝社區(qū)中各位的大力支持年鸳,譯者再次奉上一點點福利:阿里云產(chǎn)品券趴久,享受所有官網(wǎng)優(yōu)惠,并抽取幸運大...
    HetfieldJoe閱讀 2,987評論 4 14
  • 聲明:此文為轉(zhuǎn)載文章搔确,為了自己看起來方便特此重新排版彼棍,等日后看懂了再自己整理疏解,查看原文請點擊這里膳算。 正文: J...
    辭鏡朱顏閱讀 533評論 0 1
  • 一. 普通對象與函數(shù)對象JavaScript 中座硕,萬物皆對象!但對象也是有區(qū)別的涕蜂。分為普通對象和函數(shù)對象华匾,Obje...
    80bb3ef13dea閱讀 1,593評論 1 10
  • “病房的2床老爺子太不讓人省心了!”早上剛到科里就聽同事小美在一旁抱怨道机隙。其實這早已不是什么新聞蜘拉,2床老爺子住院不...
    梁倩倩閱讀 554評論 6 4