组合继承
也叫伪经典继承;指将原型链和构造函数技术组合一起的继承方式
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); //第二次调用SuperType()
this.age =age;
}
//继承方法
SubType.prototype = new SuperType(); //第一次调用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构造函数定义了两个属性:name和colors。SuperType的原型定义了一种方法sayName()。SubType构造函数在调用SuperType构造函数时传入了name参数,也同时定义了自己的属性age。然后将SuperType是实例赋值个SubType的原型,然后又在新的原型上定义方法sayAge()。这样就可以让两个不同的SubType实例分别拥有自己的属性包括colors属性,又可以使用相同的方法
不足:
组合继承最大的不足是,无论什么情况下,都会调用两次超类型构造函数,一次是在创建子类原型时,第二次是在构造函数内部
寄生组合继承
寄生组合继承是借用构造函数来继承属性,通过原型链混成形式来继承方法
//替换了第一次调用
function inheritPrototype(subType,superType){
var prototype=Object.create(superType.prototype); //创建对象
prototype.constructor=subType; //为对象添加constructor属性,弥补重写原型而失去的constructor属性
subType.prototype=prototype; //将创建的对象赋值给子类的原型
}
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