搞懂prototype和__proto__

轉(zhuǎn)自:https://blog.csdn.net/lc237423551/article/details/80010100

1.Javascript中所有的對象都是Object的實(shí)例,并繼承Object.prototype的屬性和方法,也就是說,Object.prototype是所有對象的爸爸。(個(gè)人感覺搞清楚這一點(diǎn)很重要) 。

? ?在對象創(chuàng)建時(shí),就會(huì)有一些預(yù)定義的屬性,其中定義函數(shù)的時(shí)候,這個(gè)預(yù)定義屬性就是prototype,這個(gè)prototype是一個(gè)普通的對象。

而定義普通的對象的時(shí)候,就會(huì)生成一個(gè)__proto__,這個(gè)__proto__指向的是這個(gè)對象的構(gòu)造函數(shù)的prototype.

詳情請看例一:(建議大家用谷歌瀏覽器查看這些對象的屬性);

function A(a){

this.a = a;

}

首先定義一個(gè)函數(shù)a,如上面所說,函數(shù)在被定義的時(shí)候就擁有了一個(gè)prototype對象。我們來打印看一下

console.log(A.prototype)

瀏覽器的結(jié)果:

如上圖,這就是函數(shù)a的prototype對象,(記住我們最開始說的,凡是對象都會(huì)有一個(gè)屬性那就是__proto__)。這個(gè)__proto__指向的就是他的構(gòu)造函數(shù)的prototype 而這個(gè)函數(shù)a的prototype對象的構(gòu)造函數(shù)是誰呢? 沒錯(cuò)就是開頭說到的Object.prototype。

看如下代碼:

???????console.log(A.prototype.__proto__)

console.log(Object.prototype)

而這兩個(gè)的結(jié)果如下:

打印出來是同一個(gè)東西,也就是說Object.prototype是所有函數(shù)的爹,當(dāng)你聲明一個(gè)函數(shù)的時(shí)候也就是相當(dāng)于對Object的實(shí)例化。這里可以對比一下new一個(gè)實(shí)例。

我們也可以用幾個(gè)方法來驗(yàn)證一下:

????????console.log(Object.prototype.isPrototypeOf(A))//true

console.log(A instanceOf Object) //true

函數(shù)a的prototype對象的另一個(gè)屬性是constructor這個(gè)屬性就指向了函數(shù)a本身,也就是指向了他自己的構(gòu)造函數(shù)。

2.我們在來用一個(gè)實(shí)例對象來說明一下原型,代碼如下:


????????function B(b){

this.b = b;

}

var b = new B('lc');

當(dāng)我們聲明一個(gè)函數(shù)B時(shí)就自動(dòng)創(chuàng)建了prototype對象。而b是構(gòu)造函數(shù)的B的實(shí)例,這是候b是一個(gè)對象,而我們知道,對象只有__proto__屬性。而這個(gè)屬性是指向他的構(gòu)造函數(shù)(B)的prototype屬性。這時(shí)候我們來打印一下b

console.log(b)

可以看到b中只有__proto__屬性,而這個(gè)屬性是指向他的構(gòu)造函數(shù)的prototype對象的,也就是說

(b.__proto__==B.prototype)答案為true;

這就是js中的prototype和__proto__的區(qū)別。

那么什么是原型鏈呢?接著上面的講,我們都知道對象都有一個(gè)toString方法。上述的實(shí)例化對象b也可以toString,

而實(shí)例化對象b本身并沒有toString的方法,那他就會(huì)沿著它的__proto__向他的構(gòu)造函數(shù)B的prototype對象去找,而這里也沒有,那他就會(huì) 繼續(xù)沿著B.prototype.__proto__向上找。而B.prototype.__proto__指向的就是Object.prototype。

我們打印一下Object.prototype:

這就是原型鏈查找,而則一層一層的鏈接 關(guān)系就是原型鏈。

————————————————

版權(quán)聲明:本文為CSDN博主「暢coder」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/lc237423551/article/details/80010100

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 第3章 基本概念 3.1 語法 3.2 關(guān)鍵字和保留字 3.3 變量 3.4 數(shù)據(jù)類型 5種簡單數(shù)據(jù)類型:Unde...
    RickCole閱讀 5,536評論 0 21
  • 引用:http://www.itdecent.cn/p/dee9f8b14771 一. 普通對象與函數(shù)對象 Ja...
    wendaoliu閱讀 366評論 0 0
  • 在典型的面向?qū)ο蟮恼Z言中,如java,都存在類(class)的概念,類就是對象的模板,對象就是類的實(shí)例。但是在Ja...
    DecadeHeart閱讀 927評論 1 3
  • 什么是原型語言 只有對象,沒有類;對象繼承對象,而不是類繼承類。 “原型對象”是核心概念。原型對象是新對象的模板,...
    zhoulujun閱讀 2,458評論 0 12
  • 初三那年,有一段時(shí)間,感覺復(fù)習(xí)到了瓶頸期,成績波動(dòng)性很大,復(fù)習(xí)效率很低,甚至為負(fù)。整個(gè)人很迷茫,經(jīng)常上課走神,對老...
    木不周閱讀 331評論 3 0

友情鏈接更多精彩內(nèi)容