類式繼承
function SuperClass(){
this.superValue = 'superValue';
this.langs = ['js','html'];
}
SuperClass.prototype.getSuperValue = function(){
return this.superValue;
}
function SubClass(){
this.subValue = 'subValue';
}
SubClass.prototype = new SuperClass();
SubClass.prototype.getSubValue = function(){
return this.subValue;
}
缺點: 1.父類構(gòu)造函數(shù)中的引用類型會被子類實例共享
2.子類實例化過程中不能將參數(shù)傳給父類構(gòu)造函數(shù)
構(gòu)造函數(shù)繼承
function SuperClass(name){
this.superValue = 'superValue';
this.langs = ['js','html'];
this.name = name || 'super';
}
SuperClass.prototype.getSuperValue = function(){
return this.superValue;
}
function SubClass(name){
this.subValue = 'subValue';
SuperClass.call(this,name);
}
SubClass.prototype.getSubValue = function(){
return this.subValue;
}
優(yōu)點: 子類實例化過程中可傳參給父類構(gòu)造函數(shù)
缺點: 子類不能繼承到父類prototype上的屬性
組合繼承
類式繼承 + 構(gòu)造函數(shù)繼承
function SuperClass(name){
this.superValue = 'superValue';
this.langs = ['js','html'];
this.name = name || 'super';
}
SuperClass.prototype.getSuperValue = function(){
return this.superValue;
}
function SubClass(name){
this.subValue = 'subValue';
SuperClass.call(this,name);
}
SubClass.prototype = new SuperClass();
SubClass.prototype.getSubValue = function(){
return this.subValue;
}
優(yōu)點: 1.子類實例中更改繼承的引用類型不會影響到其他子類實例
2.子類實例化過程中能將參數(shù)傳遞給父類的構(gòu)造函數(shù)
缺點: 子類繼承會調(diào)用兩次父類構(gòu)造函數(shù)(prototype和call)
原型式繼承
function inheritObject(o){
function F(){}
F.prototype = o;
return new F();
}
---
var book = {
name:'langs'
content:['js','html']
}
var newBook = inheritObject(book);
類似于類式繼承
缺點:同類式繼承
優(yōu)點:可根據(jù)已有對象創(chuàng)建新對象,不必創(chuàng)建自定義的類
寄生式繼承
var book = {
name:'langs'
content:['js','html']
}
function createBook(o){
var obj = inheritObject(o);
//擴展新對象
obj.getName = function(){
console.log('name');
}
return obj;
}
在原型式繼承的基礎(chǔ)上擴展屬性
優(yōu)缺點同原型式繼承
寄生組合式繼承
寄生式繼承 + 構(gòu)造函數(shù)繼承
function inheritPrototype(subClass,superClass){
var p = inheritObject(superClass);
p.constructor = subClass;
subClass.prototype = p;
}
function SuperClass(value){
this.superValue = value || 'superValue';
this.langs = ['js','html'];
}
SuperClass.prototype.getSuperValue = function(){
return this.superValue;
}
function SubClass(value){
SuperClass.call(this, value);
}
inheritPrototype(SubClass, SuperClass);
優(yōu)點:1.子類實例中更改繼承的引用類型不會影響到其他子類實例
2.子類實例化過程中可傳參給父類構(gòu)造函數(shù)
缺點:代碼實現(xiàn)復(fù)雜