組合繼承
也叫偽經(jīng)典繼承般又;指將原型鏈和構造函數(shù)技術組合一起的繼承方式
function SuperType(name){
this.name =name;
this.colors =["red","blud","green"];
}
SuperType.prototype.sayName =function(){
alert(this.name);
}
function SubType(name,age){
//繼承屬性
SuperType.call(this,name); //第二次調(diào)用SuperType()
this.age =age;
}
//繼承方法
SubType.prototype = new SuperType(); //第一次調(diào)用SuperType()
SubType.prototype.construcotr = SubType;
SubType.prototype.sayAge = function() {
alert(this.age);
}
var xyy = new SubType("xyy",21);
xyy.sayName(); //xyy
xyy.sayAge(); //21
var xyy2 = new SubType("xyy2",212);
xyy.sayName(); //xyy2
xyy.sayAge(); //212
xyy => SubType => SuperType
SuperType構造函數(shù)定義了兩個屬性:name和colors账嚎。SuperType的原型定義了一種方法sayName()刀脏。SubType構造函數(shù)在調(diào)用SuperType構造函數(shù)時傳入了name參數(shù)宛裕,也同時定義了自己的屬性age劲赠。然后將SuperType是實例賦值個SubType的原型延欠,然后又在新的原型上定義方法sayAge()欺矫。這樣就可以讓兩個不同的SubType實例分別擁有自己的屬性包括colors屬性,又可以使用相同的方法
不足:
組合繼承最大的不足是篮奄,無論什么情況下捆愁,都會調(diào)用兩次超類型構造函數(shù),一次是在創(chuàng)建子類原型時窟却,第二次是在構造函數(shù)內(nèi)部
寄生組合繼承
寄生組合繼承是借用構造函數(shù)來繼承屬性昼丑,通過原型鏈混成形式來繼承方法
//替換了第一次調(diào)用
function inheritPrototype(subType,superType){
var prototype=Object.create(superType.prototype); //創(chuàng)建對象
prototype.constructor=subType; //為對象添加constructor屬性,彌補重寫原型而失去的constructor屬性
subType.prototype=prototype; //將創(chuàng)建的對象賦值給子類的原型
}
function SuperType(name){
this.name =name;
this.colors =["red","blud","green"];
}
SuperType.prototype.sayName =function(){
alert(this.name);
}
function SubType(name,age){
SuperType.call(this,name);
this.age =age;
}
inheritPrototype(SubType,SuperType);
SubType.prototype.sayAge=function(){
alert(this.age);
};//擴展出sayAge方法
var person1=new SubType("nUll",25);
var person2=new SubType("mywei",25);
person1.colors.push("gay3");
person1.sayName();
person1.sayAge();
console.log(person1.colors); //["red", "blud", "green", "gay3"]
console.log(person2.colors); //["red", "blud", "green"]
console.log(person1 instanceof SubType); //true
console.log(person1 instanceof SuperType); //true
console.log(SubType.prototype.isPrototypeOf(person1)); //true
console.log(SuperType.prototype.isPrototypeOf(person1)); //true