摘要:子類(lèi)不是父類(lèi)實(shí)例的問(wèn)題是由類(lèi)式繼承引起的。所以寄生式繼承和構(gòu)造函數(shù)繼承的組合又稱(chēng)為一種新的繼承方式。但是這里的寄生式繼承處理的不是對(duì)象,而是類(lèi)的原型。看上去略微復(fù)雜,還得好好研究。
寄生組合式繼承(終極繼承者)
前面學(xué)習(xí)了類(lèi)式繼承和構(gòu)造函數(shù)繼承組合使用,也就是組合繼承,但是這種繼承方式有個(gè)問(wèn)題,就是子類(lèi)不是父類(lèi)的實(shí)例,而子類(lèi)的原型是父類(lèi)的實(shí)例。子類(lèi)不是父類(lèi)實(shí)例的問(wèn)題是由類(lèi)式繼承引起的。因此還有一種更好的繼承方式,那就是寄生組合式繼承,也就是寄生式繼承和構(gòu)造函數(shù)繼承的組合,因?yàn)榧纳嚼^承依托于原型繼承,原型繼承又與類(lèi)式繼承相像。所以寄生式繼承和構(gòu)造函數(shù)繼承的組合又稱(chēng)為一種新的繼承方式。但是這里的寄生式繼承處理的不是對(duì)象,而是類(lèi)的原型。
/** *寄生式繼承 繼承原型 * 傳遞參數(shù) subClass子類(lèi) * 傳遞參數(shù) superClass 父類(lèi) */ function inheritPrototype(subClass,superClass) { //復(fù)制一份父類(lèi)的原型副本保存在變量中 var p = inheritObject(superClass.prototype); //修正因?yàn)橹貙?xiě)子類(lèi)原型副本保存在變量中 p.constructor = subClass; //設(shè)置子類(lèi)的原型 subClass.prototype = p; } //測(cè)試代碼 //定義父類(lèi) function SuperClass(name) { this.name = name; this.colors =["red","blue","green"]; } //定義父類(lèi)原型方法 SuperClass.prototype.getName = function () { console.log(this.name); }; //定義子類(lèi) function SubClass(name,time) { //構(gòu)造函數(shù)式繼承 SuperClass.call(this,name); //子類(lèi)新增屬性 this.time = time; } //寄生式繼承父類(lèi)原型 inheritPrototype(SubClass,SuperClass); //子類(lèi)新增原型方法 SubClass.prototype.getTime = function () { console.log(this.time); }; //創(chuàng)建兩個(gè)測(cè)試方法 var instance1 = new SubClass("js",2018); var instance2 = new SubClass("css",8102); instance1.colors.push("black"); console.log(instance1.colors);//[ "red", "blue", "green", "black" ] console.log(instance2.colors);//[ "red", "blue", "green" ] instance2.getName();//css instance2.getTime();//8102
寄生組合式繼承主要是通過(guò)寄生式繼承重新繼承父類(lèi)的原型,需要繼承的僅僅是父類(lèi)的原型,而不需要再調(diào)用父類(lèi)的構(gòu)造函數(shù),也就是說(shuō)在構(gòu)造函數(shù)繼承中我們已經(jīng)調(diào)用了父類(lèi)的構(gòu)造函數(shù),因此我們需要的就是父類(lèi)的原型對(duì)象的一個(gè)副本,而這個(gè)副本通過(guò)原型繼承即可得到,但是直接賦值給子類(lèi)會(huì)有問(wèn)題,因?yàn)閷?duì)父類(lèi)原型對(duì)象復(fù)制得到的復(fù)制對(duì)象p中的constructor指向的不是subClass子類(lèi)對(duì)象,因此在寄生式繼承中要對(duì)復(fù)制對(duì)象p做一次增強(qiáng),修復(fù)其constructor屬性指向不正確的問(wèn)題,最后將得到的復(fù)制對(duì)象p賦值給子類(lèi)的原型,這樣子類(lèi)的原型就繼承了父類(lèi)的原型并且沒(méi)有執(zhí)行父類(lèi)的構(gòu)造函數(shù)。
看上去略微復(fù)雜,還得好好研究。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/97923.html
摘要:原文鏈接一什么是非構(gòu)造函數(shù)的繼承比如,現(xiàn)在有一個(gè)對(duì)象,叫做中國(guó)人。通過(guò)函數(shù),繼承了。中國(guó)北京上海香港廈門(mén)北京上海香港廈門(mén)北京上海香港這時(shí),父對(duì)象就不會(huì)受到影響了。目前,庫(kù)使用的就是這種繼承方法。 原文鏈接 一、什么是非構(gòu)造函數(shù)的繼承? 比如,現(xiàn)在有一個(gè)對(duì)象,叫做中國(guó)人。 var Chinese = { nation: 中國(guó) } 還有一個(gè)對(duì)象,叫做醫(yī)生。 var Doctor = {...
摘要:很多情況下,通常一個(gè)人類(lèi),即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類(lèi)是相似對(duì)象的描述,稱(chēng)為類(lèi)的定義,是該類(lèi)對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類(lèi)的實(shí)體化形成的對(duì)象。一類(lèi)的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類(lèi)的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類(lèi),即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類(lèi)是相似對(duì)象的描述,稱(chēng)為類(lèi)的定義,是該類(lèi)對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類(lèi)的實(shí)體化形成的對(duì)象。一類(lèi)的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類(lèi)的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個(gè)人類(lèi),即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類(lèi)是相似對(duì)象的描述,稱(chēng)為類(lèi)的定義,是該類(lèi)對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類(lèi)的實(shí)體化形成的對(duì)象。一類(lèi)的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類(lèi)的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:組合繼承前面兩種模式的特點(diǎn)類(lèi)式繼承通過(guò)子類(lèi)的原型對(duì)父類(lèi)實(shí)例化實(shí)現(xiàn)的,構(gòu)造函數(shù)式繼承是通過(guò)在子類(lèi)的構(gòu)造函數(shù)作用環(huán)境中執(zhí)行一次父類(lèi)的構(gòu)造函數(shù)來(lái)實(shí)現(xiàn)的。 類(lèi)有三部分 構(gòu)造函數(shù)內(nèi)的,供實(shí)例化對(duì)象復(fù)制用的 構(gòu)造函數(shù)外的,直接通過(guò)點(diǎn)語(yǔ)法添加的,供類(lèi)使用,實(shí)例化對(duì)象訪問(wèn)不到 類(lèi)的原型中的,實(shí)例化對(duì)象可以通過(guò)其原型鏈間接地訪問(wèn)到,也是供所有實(shí)例化對(duì)象所共用的。 類(lèi)式繼承 類(lèi)的原型對(duì)象的作用就是為類(lèi)...
閱讀 3960·2021-11-24 09:38
閱讀 1225·2021-10-19 11:42
閱讀 1829·2021-10-14 09:42
閱讀 2154·2019-08-30 15:44
閱讀 544·2019-08-30 14:04
閱讀 2888·2019-08-30 13:13
閱讀 1949·2019-08-30 12:51
閱讀 956·2019-08-30 11:22