關(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","修改"]
通過(guò)上面的代碼,我們注意“加紅”的代碼,子類Child的原型對(duì)象是父類Father的一個(gè)實(shí)例(new Father()),我們?cè)谶@里是調(diào)用new Father()對(duì)象中的theSuperValue屬性,因?yàn)閚ew Father()對(duì)象中沒(méi)有此屬性(只有name屬性),因此會(huì)沿著原型鏈向它的原型對(duì)象(Father.prototype)中去找,找到后發(fā)現(xiàn)是一個(gè)數(shù)組,而且是引用類型,此時(shí)我們往此數(shù)組中添加一個(gè)字符串“修改”。
之后,我們新建了Child的實(shí)例對(duì)象theChild,當(dāng)theChild調(diào)用theSuperValue屬性時(shí),首先它自己里面沒(méi)有此屬性,就會(huì)去它的原型對(duì)象(new Father)中去找,可惜這里也沒(méi)有,接著會(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ù)組都是引用類型的?。?
通過(guò)上面的贅述,本來(lái)已經(jīng)理解原型鏈概念的朋友覺(jué)得是廢話連篇,其實(shí)我也是呵呵,接下來(lái)我們?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ā)生了“巨大”變化,見(jiàn)下面的截圖:
為什么我說(shuō)是巨大變化,是因?yàn)槲覀儚摹爸赜霉矊傩浴边^(guò)渡到“覆蓋公共屬性,建立自己特色屬性”上來(lái)!我這里是用數(shù)組演示的,其實(shí)第二種情況常常用在Function中,用子類的方法來(lái)覆蓋父類的方法。
在第二段代碼中,我們需要關(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ì)象上并沒(méi)有啊,這是為什么呢?因?yàn)槲覀儎偛鸥采w的是Father對(duì)象new Father();而不是Father類,所以,通過(guò)Fater()構(gòu)造函數(shù)創(chuàng)建的新對(duì)象theFather并不包含新建的屬性,當(dāng)然,接下來(lái)的事情大家都明白,就是沿著原型鏈向上找,OK,在Father.prototype中找到了,就是我們一開(kāi)始定義的那個(gè)數(shù)組。
通過(guò)上面兩個(gè)例子,我們?cè)贘S中使用原型提供的繼承功能時(shí),尤其是利用子對(duì)象操作原型方法、對(duì)象時(shí),切記“=”號(hào)賦值與引用調(diào)用這兩種不同的操作,因?yàn)樗麄儠?huì)帶來(lái)完全不同的結(jié)果。
相關(guān)文章
Javascript iframe交互并兼容各種瀏覽器的解決方法
這篇文章主要介紹了Javascript iframe交互并兼容各種瀏覽器的解決方法的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07利用XMLHTTP傳遞參數(shù)在另一頁(yè)面執(zhí)行并刷新本頁(yè)
利用XMLHTTP傳遞參數(shù)在另一頁(yè)面執(zhí)行并刷新本頁(yè)...2006-10-10微信小程序tab左右滑動(dòng)切換功能的實(shí)現(xiàn)代碼
這篇文章主要介紹了微信小程序tab左右滑動(dòng)切換功能的實(shí)現(xiàn)代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02兩個(gè)listbox實(shí)現(xiàn)選項(xiàng)的添加刪除和搜索
listbox竟然可以實(shí)現(xiàn)選項(xiàng)的添加刪除和搜索不可思議吧,至于采用什么樣的方法實(shí)現(xiàn)的,具體代碼祥看本文嘍,或許可以幫助到你2013-03-03javascript實(shí)例分享---具有立體效果的圖片特效
此實(shí)例,直接粘貼代碼即可運(yùn)行,當(dāng)然圖片的路徑不要忘記改了。2014-06-06JS正則驗(yàn)證多個(gè)郵箱完整實(shí)例【郵箱用分號(hào)隔開(kāi)】
這篇文章主要介紹了JS正則驗(yàn)證多個(gè)郵箱的方法,且郵箱字符串使用分號(hào)隔開(kāi),非常簡(jiǎn)單實(shí)用,需要的朋友可以參考下2017-04-04