轉(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