Javascript玩轉(zhuǎn)繼承(三)
首先,我們來看非主流繼承一:實例繼承法。
我也不說那么多廢話了,既然是非主流繼承,就一定不常用,既然不常用還存在,那就只有一個因素,他用于特定的場合。實例繼承法,就主要用于核心對象的繼承,也是目前為止唯一能夠解決核心對象繼承的方式。
核心對象的繼承擁有一定的價值,比如說Error對象,我們公司可能要自己實現(xiàn)一個Error 類來簡化今后的開發(fā),那么這個時候我就要使用實例繼承法來繼承Error。
代碼如下:
function ExtendingError(mes)
{
var instance=new Error(mes);
instance.NewError=function(){
alert("Your Error is "+mes);
}
return instance;
}
好,測試下:
var e=new ExtendingError("Your number is less than one");
e.NewError();
alert(e.toString());
結(jié)果讓我們滿意:
好,廢話不多說,這個是非主流繼承方式,基本只用于核心對象的繼承,記住就好!
接下來看看非主流繼承二:拷貝繼承法.
顧名思義,拷貝繼承,就是通過拷貝實現(xiàn)對象的繼承,拷貝什么呢?很明顯,就是對象的屬性和方法,還記得Javascript中,類其實就一個Hashtable么?如果想不起來的話,就回去復(fù)習(xí)一下基礎(chǔ),我可能會在過一段時間寫一篇關(guān)于Javascript對象的知識。
了解了這個就好辦了,直接看代碼:
首先寫一個Extend方法:
Function.prototype.Extend=function(){
for(var pro in obj)
{
//這樣其實就是把父類的屬性和方法完全復(fù)制過去了
this.prototype[pro]=obj[pro];
}
}
好了,再寫段代碼看下如何使用:
function Animal()
{ }
function People()
{ }
People.Extend(new Animal())
{ }
明眼人一眼看出來,這個方法的缺點太明顯了:
將對象的屬性方法一一復(fù)制的時候,其實用的是反射,反射對效率的損傷我就不多說了。
和原型繼承一樣,必須初始化父類對象,當(dāng)確定繼承關(guān)系時,但是參數(shù)還不確定時,玩不轉(zhuǎn)!
總之,這個方法一般情況下不用。
好了,下面說個常用的東西。混合繼承!
這個是基于兩個主流繼承方式的。對比兩個繼承方式,我們可以發(fā)現(xiàn)兩個繼承方式的優(yōu)缺點是互補(bǔ)的,那就好辦了,混合到一起吧!
function People(name)
{
this.name=name;
this.SayName=function(){
alert("My name is "+name);
}
}
function Girl(name,age)
{
//構(gòu)造繼承
this.father=People;
this.father(name);
delete this.father;
this.Introduce=function(){
alert("My name is "+name+".I am"+age);
}
}
//原型繼承
Girl.prototype=new People();
好了,兩種方式的混合,現(xiàn)在看看,是不是問題解決了呢?
var g=new Girl("Xuan",22);
alert(g instanceof People);
g.SayName();
g.Introduce();
測試通過!
這是一個相對完美的解決方案,但是卻增加了代碼的復(fù)雜度,所以具體的方案還要靠大家在實踐中去選擇。
Javascript玩轉(zhuǎn)繼承的方式就這些,歡迎大家繼續(xù)關(guān)注我的其他文章。
相關(guān)文章
JS中不應(yīng)該使用箭頭函數(shù)的四種情況詳解
箭頭函數(shù)給我們的工作帶來了極大的方便,但是它們有什么缺點呢?我們應(yīng)該一直使用箭頭函數(shù)嗎?我們應(yīng)該在哪些場景中停止使用箭頭函數(shù)?本文就來為大家詳細(xì)講講2022-07-07細(xì)說JS數(shù)組遍歷的一些細(xì)節(jié)及實現(xiàn)
本文主要介紹了細(xì)說JS數(shù)組遍歷的一些細(xì)節(jié)及實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05關(guān)于Javascript模塊化和命名空間管理的問題說明
最近閑下來的時候,稍微想了想這個問題。關(guān)于Javascript模塊化和命名空間管理2010-12-12JavaScript鼠標(biāo)事件,點擊鼠標(biāo)右鍵,彈出div的簡單實例
下面小編就為大家?guī)硪黄狫avaScript鼠標(biāo)事件,點擊鼠標(biāo)右鍵,彈出div的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-08-08JavaScript中apply與call的用法意義及區(qū)別說明
JavaScript中有一個call和apply方法,其作用基本相同,但也有略微的區(qū)別。2010-04-04JavaScript實現(xiàn)給數(shù)字添加千位分隔符
這篇文章主要為大家詳細(xì)介紹了JavaScript如何實現(xiàn)給數(shù)字添加千位分隔符,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-11-11