js组合继承
//组合继承指的是将原型链和借用构造函数(call、apply)的技术组合到一起,从而发挥二者之长的一种继承模式,
//其背后的思路就是使用原型链实现对原型属性和方法的继承;
//而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又能保证每个实例都有它自己的属性。
//详见《高三》6.3.3章节 2014-12-17
function SuperType(name) {
this.superName = name;
this.colors = ["red", "blue"];
}
SuperType.prototype.say = function () {
document.write("Hello,I'm " + this.superName + "。<br/>");
}
function SubType(name, age) {
SuperType.call(this, name); //借用构造函数继承,还可以给父类的构造函数传递参数
//定义子类自己的属性
this.age = age;
}
/*** 因为上面子类构造函数继承了父类的实例成员,所以此处只需要继承父类的原型成员即可 ***/
//SubType.prototype = new SuperType(); //同时继承了基类的原型成员和实例成员,但这样写会使父类构造函数执行两次。(《高三》P172)
SubType.prototype = SuperType.prototype; //只继承基类的原型成员,而不继承实例成员。这样是最合理的,并且父类构造函数也只执行一次。
SubType.prototype.constructor = SubType;
SubType.prototype.SaySub = function () {
document.write("Hello,My subName is " + this.superName + ",my age is: "+this.age+"。<br/>");
}
var instance1 = new SubType("wede",25);
instance1.colors.push("green");
document.write(instance1.colors); //red,blue,green
instance1.say(); //Hello,I'm wede。
instance1.SaySub(); //Hello,My subName is wede,my age is: 25。
var instance2 = new SubType("kitty", 18);
document.write(instance2.colors); //red,blue
instance2.say(); //Hello,I'm kitty。
instance2.SaySub(); //Hello,My subName is kitty,my age is: 18。