js原型鏈原理看圖說(shuō)明
更新時(shí)間:2012年07月07日 16:53:22 作者:
任何一個(gè)對(duì)象都有一個(gè)prototype的屬性,在js中可以把它記為:__proto__
當(dāng)初ECMAscript的發(fā)明者為了簡(jiǎn)化這門語(yǔ)言,同時(shí)又保持繼承的屬性,于是就設(shè)計(jì)了這個(gè)鏈表。。
在數(shù)據(jù)結(jié)構(gòu)中學(xué)過(guò)鏈表不,鏈表中有一個(gè)位置相當(dāng)于指針,指向下一個(gè)結(jié)構(gòu)體。
于是乎__proto__也一樣,每當(dāng)你去定義一個(gè)prototype的時(shí)候,相當(dāng)于把該實(shí)例的__proto__指向一個(gè)結(jié)構(gòu)體,那么這個(gè)被指向結(jié)構(gòu)體就稱為該實(shí)例的原型。
文字說(shuō)起來(lái)有點(diǎn)兒繞,看圖說(shuō)話
var foo = {
x: 10,
y: 20
};
當(dāng)我不指定__proto__的時(shí)候,foo也會(huì)預(yù)留一個(gè)這樣的屬性,
如果有明確的指向,那么這個(gè)鏈表就鏈起來(lái)啦。
很明顯,下圖中b和c共享a的屬性和方法,同時(shí)又有自己的私有屬性。
__proto__默認(rèn)的也有指向。它指向的是最高級(jí)的object.prototype,而object.prototype的__proto__為空。
var a = {
x: 10,
calculate: function (z) {
return this.x + this.y + z
}
};
var b = {
y: 20,
__proto__: a
};
var c = {
y: 30,
__proto__: a
};
// call the inherited method
b.calculate(30); // 60
理解了__proto__這個(gè)屬性鏈接指針的本質(zhì)。。再來(lái)理解constructor。
當(dāng)定義一個(gè)prototype的時(shí)候,會(huì)構(gòu)造一個(gè)原形對(duì)象,這個(gè)原型對(duì)象存儲(chǔ)于構(gòu)造這個(gè)prototype的函數(shù)的原形方法之中.
function Foo(y){
this.y = y ;
}
Foo.prototype.x = 10;
Foo.prototype.calculate = function(z){
return this.x+this.y+z;
};
var b = new Foo(20);
alert(b.calculate(30));
http://dmitrysoshnikov.com/ecmascript/javascript-the-core/
在數(shù)據(jù)結(jié)構(gòu)中學(xué)過(guò)鏈表不,鏈表中有一個(gè)位置相當(dāng)于指針,指向下一個(gè)結(jié)構(gòu)體。
于是乎__proto__也一樣,每當(dāng)你去定義一個(gè)prototype的時(shí)候,相當(dāng)于把該實(shí)例的__proto__指向一個(gè)結(jié)構(gòu)體,那么這個(gè)被指向結(jié)構(gòu)體就稱為該實(shí)例的原型。
文字說(shuō)起來(lái)有點(diǎn)兒繞,看圖說(shuō)話
復(fù)制代碼 代碼如下:
var foo = {
x: 10,
y: 20
};

當(dāng)我不指定__proto__的時(shí)候,foo也會(huì)預(yù)留一個(gè)這樣的屬性,
如果有明確的指向,那么這個(gè)鏈表就鏈起來(lái)啦。
很明顯,下圖中b和c共享a的屬性和方法,同時(shí)又有自己的私有屬性。
__proto__默認(rèn)的也有指向。它指向的是最高級(jí)的object.prototype,而object.prototype的__proto__為空。
復(fù)制代碼 代碼如下:
var a = {
x: 10,
calculate: function (z) {
return this.x + this.y + z
}
};
var b = {
y: 20,
__proto__: a
};
var c = {
y: 30,
__proto__: a
};
// call the inherited method
b.calculate(30); // 60

理解了__proto__這個(gè)屬性鏈接指針的本質(zhì)。。再來(lái)理解constructor。
當(dāng)定義一個(gè)prototype的時(shí)候,會(huì)構(gòu)造一個(gè)原形對(duì)象,這個(gè)原型對(duì)象存儲(chǔ)于構(gòu)造這個(gè)prototype的函數(shù)的原形方法之中.
復(fù)制代碼 代碼如下:
function Foo(y){
this.y = y ;
}
Foo.prototype.x = 10;
Foo.prototype.calculate = function(z){
return this.x+this.y+z;
};
var b = new Foo(20);
alert(b.calculate(30));

http://dmitrysoshnikov.com/ecmascript/javascript-the-core/
相關(guān)文章
利用types增強(qiáng)vscode中js代碼提示功能詳解
這篇文章主要給大家介紹了如何增強(qiáng)vscode中js代碼提示功能的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-07-07
JS實(shí)現(xiàn)多物體緩沖運(yùn)動(dòng)實(shí)例代碼
這篇文章主要介紹了JS實(shí)現(xiàn)多物體緩沖運(yùn)動(dòng)實(shí)例代碼,有需要的朋友可以參考一下2013-11-11
javascript動(dòng)畫系列之模擬滾動(dòng)條
本文主要介紹了js動(dòng)畫模擬滾動(dòng)條的實(shí)現(xiàn)原理以及分享了通過(guò)滾動(dòng)條實(shí)現(xiàn)的幾個(gè)應(yīng)用的實(shí)例代碼:1.通過(guò)移動(dòng)滾動(dòng)條來(lái)實(shí)現(xiàn)數(shù)字的加減;2.通過(guò)拖動(dòng)滾動(dòng)條來(lái)實(shí)現(xiàn)元素尺寸的變化,以改變?cè)貙挾葹槔?3.通過(guò)拖動(dòng)滾動(dòng)條來(lái)實(shí)現(xiàn)內(nèi)容滾。需要的朋友一起來(lái)看下吧2016-12-12
javascript 操作Word和Excel的實(shí)現(xiàn)代碼
javascript 操作Word和Excel的實(shí)現(xiàn)代碼, 需要的朋友可以參考下。2009-10-10
當(dāng)鼠標(biāo)滑過(guò)文本框自動(dòng)選中輸入框內(nèi)容的JS代碼分享
這篇文章主要介紹了當(dāng)鼠標(biāo)滑過(guò)文本框自動(dòng)選中輸入框內(nèi)容的JS代碼,有需要的朋友可以參考一下2013-11-11
教學(xué)演示-UBB,剪貼板,textRange及其他
教學(xué)演示-UBB,剪貼板,textRange及其他...2006-07-07
JavaScript中將值轉(zhuǎn)換為字符串的五種方法總結(jié)
這篇文章主要給大家總結(jié)介紹了關(guān)于JavaScript中將值轉(zhuǎn)換為字符串的五種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用JavaScript具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06
在Webpack中用url-loader處理圖片和字體的問(wèn)題
這篇文章主要介紹了在Webpack中用url-loader處理圖片和字體的問(wèn)題及解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04

