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