1,將優(yōu)點為我所用——組合繼承
//組合式繼承
//聲明父類
function SuperClass (name) {
//值類型共有屬性
this.name = name;
//引用類型共有屬性
this.books = ["html", "css", "JavaScript"];
}
//父類原型共有方法
SuperClass.prototype.getName = function() {
console.log(this.name);
};
//聲明子類
function SubClass = function (name, time) {
//構(gòu)造函數(shù)式繼承父類name屬性
SuperClass.call(this,name);
//子類中新增共有屬性
this.time = time;
}
//類式繼承,子類原型繼承父類
SubClass.prototype = new SuperClass();
//子類原型方法
SubClass.prototype.getTime = function () {
console.log(this.time);
}
組合式繼承好渠,在使用構(gòu)造函數(shù)繼承時執(zhí)行了一遍父類構(gòu)造函數(shù),而在實現(xiàn)子類原型的類式繼承時又調(diào)用了一遍父類構(gòu)造函數(shù)逝淹。因此父類構(gòu)造函數(shù)調(diào)用了兩次颠蕴,所以不是最完美的構(gòu)造方法。
2茎活,潔凈的繼承者——原型式繼承
借助原型prototype可以根據(jù)已有的對象創(chuàng)建一個新的對象歉闰,同時不必創(chuàng)建新的自定義對象類型辖众。實現(xiàn)代碼如下:
//原型式繼承
function inheritObject (o) {
//聲明一個過度函數(shù)對象
function F () {
//過度對象的原型繼承父類對象
F.prototype = o;
//返回過度對象的一個實例,該實例的原型繼承了父對象
return new F();
}