JavaScript物件導向程式設計 繼承(三)

2021-09-13 09:08:18 字數 1368 閱讀 7085

前面學習了類式繼承和建構函式繼承組合使用,也就是組合繼承,但是這種繼承方式有個問題,就是子類不是父類的例項,而子類的原型是父類的例項。子類不是父類例項的問題是由類式繼承引起的。因此還有一種更好的繼承方式,那就是寄生組合式繼承,也就是寄生式繼承和建構函式繼承的組合,因為寄生式繼承依託於原型繼承,原型繼承又與類式繼承相像。所以寄生式繼承和建構函式繼承的組合又稱為一種新的繼承方式。但是這裡的寄生式繼承處理的不是物件,而是類的原型。

/**

*寄生式繼承 繼承原型

* 傳遞引數 subclass子類

* 傳遞引數 superclass 父類

*/function inheritprototype(subclass,superclass)

//測試**

//定義父類

function superclass(name)

//定義父類原型方法

superclass.prototype.getname = function () ;

//定義子類

function subclass(name,time)

//寄生式繼承父類原型

inheritprototype(subclass,superclass);

//子類新增原型方法

subclass.prototype.gettime = function () ;

//建立兩個測試方法

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

寄生組合式繼承主要是通過寄生式繼承重新繼承父類的原型,需要繼承的僅僅是父類的原型,而不需要再呼叫父類的建構函式,也就是說在建構函式繼承中我們已經呼叫了父類的建構函式,因此我們需要的就是父類的原型物件的乙個副本,而這個副本通過原型繼承即可得到,但是直接賦值給子類會有問題,因為對父類原型物件複製得到的複製物件p中的constructor指向的不是subclass子類物件,因此在寄生式繼承中要對複製物件p做一次增強,修復其constructor屬性指向不正確的問題,最後將得到的複製物件p賦值給子類的原型,這樣子類的原型就繼承了父類的原型並且沒有執行父類的建構函式。

看上去略微複雜,還得好好研究。

javascript 學習筆記之物件導向程式設計

物件特殊屬性 資料屬性和訪問器屬性 1 資料屬性 configurable 是否可刪除 enumerable 是否可列舉for in writable 是否可寫 value 值 要修改預設屬性必須使用defineproperty object,key,descriptor 方法 例如 var per...

JavaScript物件導向

方法一 建構函式法 function cat cat.prototype.showname function var cat new cat cat.name tom cat.showname tom 它用建構函式模擬 類 在其內部用this關鍵字指代例項物件。類的屬性和方法,還可以定義在建構函式的...

javaScript物件導向

code 類lecture構造器 使用兩個字串函式,name和teacher function lecture name,teacher 類lecture的方法,生成乙個顯示該課程資訊的字串 lecture.prototype.display function 類schedule的構造器 使用乙個l...