Javascript玩轉(zhuǎn)繼承(三)

字號(hào):


    首先,我們來(lái)看非主流繼承一:實(shí)例繼承法。
    我也不說(shuō)那么多廢話了,既然是非主流繼承,就一定不常用,既然不常用還存在,那就只有一個(gè)因素,他用于特定的場(chǎng)合。實(shí)例繼承法,就主要用于核心對(duì)象的繼承,也是目前為止唯一能夠解決核心對(duì)象繼承的方式。
    核心對(duì)象的繼承擁有一定的價(jià)值,比如說(shuō)Error對(duì)象,我們公司可能要自己實(shí)現(xiàn)一個(gè)Error 類(lèi)來(lái)簡(jiǎn)化今后的開(kāi)發(fā),那么這個(gè)時(shí)候我就要使用實(shí)例繼承法來(lái)繼承Error。
    代碼如下:
    function ExtendingError(mes)
    {
    var instance=new Error(mes);
    instance.NewError=function(){
    alert("Your Error is "+mes);
    }
    return instance;
    }
    好,測(cè)試下:
    代碼如下:
    var e=new ExtendingError("Your number is less than one");
    e.NewError();
    alert(e.toString());
    結(jié)果讓我們滿意:
    
1.jpg

    好,廢話不多說(shuō),這個(gè)是非主流繼承方式,基本只用于核心對(duì)象的繼承,記住就好!
    接下來(lái)看看非主流繼承二:拷貝繼承法.
    顧名思義,拷貝繼承,就是通過(guò)拷貝實(shí)現(xiàn)對(duì)象的繼承,拷貝什么呢?很明顯,就是對(duì)象的屬性和方法,還記得Javascript中,類(lèi)其實(shí)就一個(gè)Hashtable么?如果想不起來(lái)的話,就回去復(fù)習(xí)一下基礎(chǔ),我可能會(huì)在過(guò)一段時(shí)間寫(xiě)一篇關(guān)于Javascript對(duì)象的知識(shí)。
    了解了這個(gè)就好辦了,直接看代碼:
    首先寫(xiě)一個(gè)Extend方法:
    代碼如下:
    Function.prototype.Extend=function(){
    for(var pro in obj)
    {
    //這樣其實(shí)就是把父類(lèi)的屬性和方法完全復(fù)制過(guò)去了
    this.prototype[pro]=obj[pro];
    }
    }
    好了,再寫(xiě)段代碼看下如何使用:
    代碼如下:
    function Animal()
    { }
    function People()
    { }
    People.Extend(new Animal())
    { }
    明眼人一眼看出來(lái),這個(gè)方法的缺點(diǎn)太明顯了:
    將對(duì)象的屬性方法一一復(fù)制的時(shí)候,其實(shí)用的是反射,反射對(duì)效率的損傷我就不多說(shuō)了。
    和原型繼承一樣,必須初始化父類(lèi)對(duì)象,當(dāng)確定繼承關(guān)系時(shí),但是參數(shù)還不確定時(shí),玩不轉(zhuǎn)!
    總之,這個(gè)方法一般情況下不用。
    好了,下面說(shuō)個(gè)常用的東西?;旌侠^承!
    這個(gè)是基于兩個(gè)主流繼承方式的。對(duì)比兩個(gè)繼承方式,我們可以發(fā)現(xiàn)兩個(gè)繼承方式的優(yōu)缺點(diǎn)是互補(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)在看看,是不是問(wèn)題解決了呢?
    var g=new Girl("Xuan",22);
    alert(g instanceof People);
    g.SayName();
    g.Introduce();
    
2.jpg

    測(cè)試通過(guò)!
    這是一個(gè)相對(duì)完美的解決方案,但是卻增加了代碼的復(fù)雜度,所以具體的方案還要靠大家在實(shí)踐中去選擇。
    Javascript玩轉(zhuǎn)繼承的方式就這些,歡迎大家繼續(xù)關(guān)注我的其他文章。