前面學習了類式繼承和建構函式繼承組合使用,也就是組合繼承,但是這種繼承方式有個問題,就是子類不是父類的例項,而子類的原型是父類的例項。子類不是父類例項的問題是由類式繼承引起的。因此還有一種更好的繼承方式,那就是寄生組合式繼承,也就是寄生式繼承和建構函式繼承的組合,因為寄生式繼承依託於原型繼承,原型繼承又與類式繼承相像。所以寄生式繼承和建構函式繼承的組合又稱為一種新的繼承方式。但是這裡的寄生式繼承處理的不是物件,而是類的原型。
寄生組合式繼承主要是通過寄生式繼承重新繼承父類的原型,需要繼承的僅僅是父類的原型,而不需要再呼叫父類的建構函式,也就是說在建構函式繼承中我們已經呼叫了父類的建構函式,因此我們需要的就是父類的原型物件的乙個副本,而這個副本通過原型繼承即可得到,但是直接賦值給子類會有問題,因為對父類原型物件複製得到的複製物件p中的constructor指向的不是subclass子類物件,因此在寄生式繼承中要對複製物件p做一次增強,修復其constructor屬性指向不正確的問題,最後將得到的複製物件p賦值給子類的原型,這樣子類的原型就繼承了父類的原型並且沒有執行父類的建構函式。/**
*寄生式繼承 繼承原型
* 傳遞引數 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
看上去略微複雜,還得好好研究。
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...