成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承

魏明 / 916人閱讀

摘要:以下是幾種中實(shí)現(xiàn)繼承的方式方法它們也是各自有各自的優(yōu)缺點(diǎn)選擇哪一種根據(jù)自己的應(yīng)用而定最適合自己的才是最好的通過原型鏈繼承通過原型對(duì)象繼承缺點(diǎn)引用類型的值在原型中會(huì)被所有實(shí)例共享不能向超類的構(gòu)造函數(shù)中傳遞參數(shù)借用構(gòu)造函數(shù)繼承借用構(gòu)造函數(shù)繼承是

以下是幾種js中實(shí)現(xiàn)繼承的方式方法,它們也是各自有各自的優(yōu)缺點(diǎn),選擇哪一種根據(jù)自己的應(yīng)用而定,最適合自己的才是最好的.

通過原型鏈繼承
function SuperType(){
    this.name = "yahualingfeng";
}

SuperType.prototype.friends = ["David","Bob","Lucy"];
SuperType.prototype.sayName = function(){
    
  alert(this.name);
  
};

function SubType(){
    this.age = 30;    
}

SubType.protoType = new SuperType();//通過原型對(duì)象繼承SuperType

var subType1 = new SubType();
var subType2 = new SubType();

subType1.friends.push("Jake");

console.log(subType1.friends); // ["David","Bob","Lucy","Jake"]
console.log(subType2.friends); // ["David","Bob","Lucy","Jake"]

缺點(diǎn):

引用類型的值在原型中會(huì)被所有實(shí)例共享.

不能向超類的構(gòu)造函數(shù)中傳遞參數(shù)

借用構(gòu)造函數(shù)繼承

借用構(gòu)造函數(shù)繼承是將超類(SuperType)所有的屬性和方法都寫在構(gòu)造函數(shù)中,最后在函數(shù)(SubType)體內(nèi)通過call方法調(diào)用超類.

function SuperType(){
    this.name = "yuhualingfeng";
    this.friends =["David","Bob","Lucy"];
    this.sayName = function(){
        alert(this.name);
    }
}

function SubType(){
    SuperType.call(this);
}

var subType = new SubType();
subType.sayName();

缺點(diǎn):方法的定義都存在構(gòu)造函數(shù)中,導(dǎo)致函數(shù)無法被復(fù)用.

組合繼承

組合繼承是原型鏈繼承和構(gòu)造函數(shù)繼承的結(jié)合體,結(jié)合了二者的優(yōu)點(diǎn),即實(shí)現(xiàn)了函數(shù)的復(fù)用,也不會(huì)導(dǎo)致引用類型值在多個(gè)實(shí)例中共享.

function SuperType(){
    this.name="yuhualingfeng";
    this.friends=["David","Bob","Lucy"];
}
SuperType.prototype.sayName = function(){
    
    alert(this.name);

};

function SubType(){

    SuperType.call(this);

}

SubType.prototype = new SuperType();

var subType = new SubType();

缺點(diǎn):

超類函數(shù)被執(zhí)行了兩次.

超類構(gòu)造函數(shù)SuperType自身的屬性(name,friends)被重復(fù)定義,即出現(xiàn)在SubType的構(gòu)造函數(shù)中,也出現(xiàn)在SubType的原型對(duì)象中.

原型繼承

原型繼承是繼承自一個(gè)對(duì)象而不是引用類型.

function object(obj){
 function F(){}
 F.prototype = obj;
 return new F();
}

這里的object方法接收obj對(duì)象,并將對(duì)象賦值給一個(gè)空函數(shù)的原型,并返回空函數(shù)的實(shí)例.

var person = {
 name:"yuhualingfeng",
 friends:["David","Bob","Lucy"]
};

var anotherPerson = object(person);
anotherPerson.name = "Jake";
anotherPerson.friends.push("Marry");

console.log(anotherPerson.friends); //["David","Bob","Lucy","Marry"]

console.log(person.friends); //["David","Bob","Lucy","Marry"]

如果不想創(chuàng)建構(gòu)造函數(shù),只想讓一個(gè)對(duì)象和另一個(gè)對(duì)象保持一致的情況下,原型繼承是完全可以勝任的,不過有一點(diǎn)要注意的是,假如繼承的屬性值為引用類型時(shí),還是會(huì)相互影響的.

寄生繼承

寄生繼承是基于原型繼承的基礎(chǔ)上擴(kuò)展自己的屬性和方法.

function createrAnother(obj){
    var clone = object(obj);
    clone.sayHi=function(){
     alert("Hi!");
    }
    return clone;
}

var person = {
    name:"yuhualingfeng"
};

var anotherPerson = createAnother(person);

anohterPerson.sayHi();  // Hi

寄生繼承也是和原型繼承一樣也是繼承對(duì)象,并產(chǎn)出對(duì)象.

寄生組合繼承

顧名思義,寄生組合繼承是集寄生繼承和組合繼承的結(jié)合體,它結(jié)合了二者的優(yōu)點(diǎn).

//繼承Supertype的原型對(duì)象
function inheritProtoType(SuperType,SubType){
 
     var prototype = object(SuperType.prototype);
     prototype.constructor = SubType;
     SubType.prototype = prototype;

}

function SuperType(){
    this.name = "yuhualingfeng";
    this.friends = ["David","Bob","Lucy"];
}

function SubType(){
    ////繼承Supertype的構(gòu)造函數(shù)屬性
    SuperType.call(this);
    this.age = 30;
}

inheritProtoType(SuperType,SubType);

var subType = new SubType();

寄生組合繼承是前面幾種繼承思想碰撞在一起的產(chǎn)物,是執(zhí)行效率最高也是應(yīng)用面最廣的.

總結(jié)

原型鏈繼承是通過為原型對(duì)象賦值,不足之處為引用類型值會(huì)被多個(gè)實(shí)例共享,構(gòu)造函數(shù)繼承解決了原型鏈繼承的問題,同時(shí)也暴露出新的問題是函數(shù)的復(fù)用無法實(shí)現(xiàn),然后我們結(jié)合二者的優(yōu)缺點(diǎn),構(gòu)造出了組合繼承,組合繼承基本上滿足了我們想要的繼承結(jié)果.
考慮到執(zhí)行的效率,我們構(gòu)思出了寄生繼承(基于原型繼承),并將寄生繼承組合繼承結(jié)合,最終得出了繼承的最優(yōu)解決方案"寄生組合繼承.

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/92340.html

相關(guān)文章

  • JS面向對(duì)象程序設(shè)計(jì)繼承實(shí)現(xiàn)-組合繼承

    摘要:實(shí)現(xiàn)思路使用原型鏈實(shí)現(xiàn)對(duì)原型方法和方法的繼承,而通過借用構(gòu)造函數(shù)來實(shí)現(xiàn)對(duì)實(shí)例屬性的繼承。繼承屬性繼承方法以上代碼,構(gòu)造函數(shù)定義了兩個(gè)屬性和。 JS面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承的實(shí)現(xiàn)-組合繼承 前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯(cuò)誤,會(huì)非常感謝您的指出。文中絕大部分內(nèi)容引用自《Java...

    antz 評(píng)論0 收藏0
  • 面向對(duì)象JavaScript繼承(一) 類式繼承

    摘要:那你們肯定會(huì)問為什么共用,而沒有共用呢,下面就給你解釋,請(qǐng)看引用類型是共用的值類型是私用的。 引言 面向?qū)ο蟮木幊陶Z言都具繼承這一機(jī)制,而 JavaScript 是基于原型(Prototype)面向?qū)ο蟪绦蛟O(shè)計(jì),所以它的實(shí)現(xiàn)方式也是基于原型(Prototype)實(shí)現(xiàn)的. 繼承的方式 類式繼承 構(gòu)造函數(shù)繼承 組合繼承 原型式繼承 寄生式繼承 寄生組合式繼承 1.類式繼承 //聲明父...

    forsigner 評(píng)論0 收藏0
  • javascript面向對(duì)象“多態(tài)”

    摘要:之前,本質(zhì)上不能算是一門面向?qū)ο蟮木幊陶Z言,因?yàn)樗鼘?duì)于封裝繼承多態(tài)這些面向?qū)ο笳Z言的特點(diǎn)并沒有在語言層面上提供原生的支持。所以在中出現(xiàn)了等關(guān)鍵字,解決了面向?qū)ο笾谐霈F(xiàn)了問題。 ES6之前,javascript本質(zhì)上不能算是一門面向?qū)ο蟮木幊陶Z言,因?yàn)樗鼘?duì)于封裝、繼承、多態(tài)這些面向?qū)ο笳Z言的特點(diǎn)并沒有在語言層面上提供原生的支持。但是,它引入了原型(prototype)的概念,可以讓我們以...

    JerryWangSAP 評(píng)論0 收藏0
  • JS面向對(duì)象程序設(shè)計(jì)繼承實(shí)現(xiàn) - 原型鏈

    摘要:簡單回顧一下構(gòu)造函數(shù)原型和實(shí)例對(duì)象之間的關(guān)系每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象。找到生成構(gòu)造函數(shù)的原型對(duì)象的構(gòu)造函數(shù),搜索其原型對(duì)象,找到了。 JS面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承的實(shí)現(xiàn) - 原型鏈 前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。如有紕漏或錯(cuò)誤,會(huì)非常感謝您的指出。文中絕大部分內(nèi)容引用自《JavaS...

    zhaochunqi 評(píng)論0 收藏0
  • JS面向對(duì)象程序設(shè)計(jì)繼承-繼承實(shí)現(xiàn)-借用構(gòu)造函數(shù)

    摘要:面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承繼承的實(shí)現(xiàn)借用構(gòu)造函數(shù)前言最近在細(xì)讀高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下。繼承了注意,這一段代碼借調(diào)了超類型的構(gòu)造函數(shù)。 JS面向?qū)ο蟮某绦蛟O(shè)計(jì)之繼承-繼承的實(shí)現(xiàn)-借用構(gòu)造函數(shù) 前言:最近在細(xì)讀Javascript高級(jí)程序設(shè)計(jì),對(duì)于我而言,中文版,書中很多地方翻譯的差強(qiáng)人意,所以用自己所理解的,嘗試解讀下...

    duan199226 評(píng)論0 收藏0
  • PHP面試面向對(duì)象(1)

    摘要:二面向?qū)ο笥惺裁刺卣髅嫦驅(qū)ο蟮闹饕卣饔谐橄罄^承封裝和多態(tài)。析構(gòu)函數(shù)析構(gòu)函數(shù)是在引入的,它的作用與調(diào)用時(shí)機(jī)和構(gòu)造函數(shù)剛好相反,它在對(duì)象被銷毀時(shí)自動(dòng)執(zhí)行。 PHP面試專欄正式起更,每周一、三、五更新,提供最好最優(yōu)質(zhì)的PHP面試內(nèi)容。PHP中面向?qū)ο蟪?嫉闹R(shí)點(diǎn)有以下7點(diǎn),我將會(huì)從以下幾點(diǎn)進(jìn)行詳細(xì)介紹說明,幫助你更好的應(yīng)對(duì)PHP面試??嫉拿嫦?qū)ο笙嚓P(guān)的知識(shí)點(diǎn)和考題。整個(gè)面向?qū)ο笪恼碌慕Y(jié)構(gòu)涉...

    phodal 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

魏明

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<