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

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

