關(guān)于JavaScript中原型繼承中的一點(diǎn)思考
//定義超類
function Father(){
this.name = "父親";
}
Father.prototype.theSuperValue = ["NO1","NO2"];
//定義子類
function Child(){
}
//實(shí)現(xiàn)繼承
Child.prototype = new Father();
//修改共享數(shù)組
Child.prototype.theSuperValue.push("修改");
//創(chuàng)建子類實(shí)例
var theChild = new Child();
console.log(theChild.theSuperValue); //["NO1","NO2","修改"]
//創(chuàng)建父類實(shí)例
var theFather = new Father();
console.log(theFather.theSuperValue); //["NO1","NO2","修改"]
通過上面的代碼,我們注意“加紅”的代碼,子類Child的原型對(duì)象是父類Father的一個(gè)實(shí)例(new Father()),我們?cè)谶@里是調(diào)用new Father()對(duì)象中的theSuperValue屬性,因?yàn)閚ew Father()對(duì)象中沒有此屬性(只有name屬性),因此會(huì)沿著原型鏈向它的原型對(duì)象(Father.prototype)中去找,找到后發(fā)現(xiàn)是一個(gè)數(shù)組,而且是引用類型,此時(shí)我們往此數(shù)組中添加一個(gè)字符串“修改”。
之后,我們新建了Child的實(shí)例對(duì)象theChild,當(dāng)theChild調(diào)用theSuperValue屬性時(shí),首先它自己里面沒有此屬性,就會(huì)去它的原型對(duì)象(new Father)中去找,可惜這里也沒有,接著會(huì)到new Father()的原型中去找,OK,在Father.prototype中找到了這個(gè)數(shù)組,發(fā)現(xiàn)是["NO1","NO2","修改"]。
再接著,我們創(chuàng)建了Father的實(shí)例對(duì)象theFather,同上,我們?cè)贔ather.prototype中找到了這個(gè)引用類型的數(shù)組["NO1","NO2","修改"]。(當(dāng)然,數(shù)組都是引用類型的?。?
通過上面的贅述,本來已經(jīng)理解原型鏈概念的朋友覺得是廢話連篇,其實(shí)我也是呵呵,接下來我們?cè)倏匆粋€(gè)相似的例子:
//定義超類
function Father() {
this.name = "父親";
}
Father.prototype.theSuperValue = ["NO1", "NO2"];
//定義子類
function Child() {
}
//實(shí)現(xiàn)繼承
Child.prototype = new Father();
//修改共享數(shù)組
Child.prototype.theSuperValue = ["我是覆蓋代碼"]
//創(chuàng)建子類實(shí)例
var theChild = new Child();
console.log(theChild.theSuperValue);
//創(chuàng)建父類實(shí)例
var theFather = new Father();
console.log(theFather.theSuperValue);
我們看一下上面的代碼,我用一種比較特別的紫色標(biāo)注了此段代碼與上段代碼的小小區(qū)別,但結(jié)果卻發(fā)生了“巨大”變化,見下面的截圖:

為什么我說是巨大變化,是因?yàn)槲覀儚摹爸赜霉矊傩浴边^渡到“覆蓋公共屬性,建立自己特色屬性”上來!我這里是用數(shù)組演示的,其實(shí)第二種情況常常用在Function中,用子類的方法來覆蓋父類的方法。
在第二段代碼中,我們需要關(guān)注的是紫色代碼前的“=”號(hào),它是賦值操作符。如果我們對(duì)Child.prototype及new Father()對(duì)象調(diào)用這個(gè)賦值操作符時(shí),我們就在這個(gè)對(duì)象上“新建”了一個(gè)屬性,當(dāng)在下面的theChild實(shí)例上調(diào)用theSuperValue時(shí),返回的當(dāng)然是新屬性值["我是覆蓋代碼"]。
但當(dāng)我們新創(chuàng)建一個(gè)父類實(shí)例theFather對(duì)象時(shí),調(diào)用該對(duì)象上的theSuperValue屬性,我們就會(huì)發(fā)現(xiàn)對(duì)象上并沒有啊,這是為什么呢?因?yàn)槲覀儎偛鸥采w的是Father對(duì)象new Father();而不是Father類,所以,通過Fater()構(gòu)造函數(shù)創(chuàng)建的新對(duì)象theFather并不包含新建的屬性,當(dāng)然,接下來的事情大家都明白,就是沿著原型鏈向上找,OK,在Father.prototype中找到了,就是我們一開始定義的那個(gè)數(shù)組。
通過上面兩個(gè)例子,我們?cè)贘S中使用原型提供的繼承功能時(shí),尤其是利用子對(duì)象操作原型方法、對(duì)象時(shí),切記“=”號(hào)賦值與引用調(diào)用這兩種不同的操作,因?yàn)樗麄儠?huì)帶來完全不同的結(jié)果。
相關(guān)文章
JS小知識(shí)之如何將CSV轉(zhuǎn)換為JSON字符串
CSV文件一般是以逗號(hào)為分隔值的文件(Comma-Separated?Values,CSV,有時(shí)也稱為字符分隔值,因?yàn)榉指糇址部梢圆皇嵌禾?hào)),其文件以純文本形式存儲(chǔ)表格數(shù)據(jù)(數(shù)字和文本),下面這篇文章主要給大家介紹了JS小知識(shí)之如何將CSV轉(zhuǎn)換為JSON字符串的相關(guān)資料,需要的朋友可以參考下2023-06-06
JavaWeb表單及時(shí)驗(yàn)證功能在輸入后立即驗(yàn)證(含用戶類型,性別,愛好...的驗(yàn)證)
最近做項(xiàng)目遇到表單在輸入后立即驗(yàn)證,而不是提交后再驗(yàn)證,在網(wǎng)上找了下資料,沒有合適的,于是我自己動(dòng)手寫了一個(gè),分享到腳本之家平臺(tái),供大家參考2017-06-06
詳談js對(duì)url進(jìn)行編碼和解碼(三種方式的區(qū)別)
下面小編就為大家?guī)硪黄斦刯s對(duì)url進(jìn)行編碼和解碼(三種方式的區(qū)別)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08
JS 控制小數(shù)位數(shù)的實(shí)現(xiàn)代碼
上網(wǎng)查一查的確存在這種Bug,除了位數(shù)上控制之外也沒什么也好的方法(希望高手能提出其它思路)。2011-08-08
詳解用webpack把我們的業(yè)務(wù)模塊分開打包的方法
本篇文章主要介紹了用webpack把我們的業(yè)務(wù)模塊分開打包的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
js核心基礎(chǔ)之構(gòu)造函數(shù)constructor用法實(shí)例分析
這篇文章主要介紹了js核心基礎(chǔ)之構(gòu)造函數(shù)constructor用法,結(jié)合具體實(shí)例形式分析了javascript構(gòu)造函數(shù)constructor概念、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-05-05
JS短路原理的應(yīng)用示例 精簡(jiǎn)代碼的途徑
正如標(biāo)題所言,js中||和&&的特性幫我們精簡(jiǎn)了代碼的同時(shí),也帶來了代碼可讀性的降低。這就需要我們自己來權(quán)衡了,下面有個(gè)不錯(cuò)的示例2013-12-12
echarts柱狀圖坐標(biāo)軸內(nèi)容顯示不全的兩種解決辦法
本文主要介紹了echarts柱狀圖坐標(biāo)軸內(nèi)容顯示不全的兩種解決辦法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05

