题外话:
只有自己尝试写个框架,才有机会接触像原型、作用域、事件代理、缓存系统、定时器等深层知识。
司徒正美《JavaScript框架设计》
单独使用原型链继承:
单独借用构造函数继承:
为此,才出现了组合继承。
组合继承(combination inheritance),有时候也叫做伪经典继承,指的是将原型链和借用构造函数的技术组合到一块,从而发挥二者之长的一种继承模式。
使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。这样,既通过在原型上定义方法实现了函数复用,又能够保证每个实例都有它自己的属性。
//console控制台验证
//构造函数实现实例属性,构造函数的优点
function SuperType(name) {
this.name = name;
this.numbers = [1,2,3];
}
//原型来定义方法,原型链的优点
SuperType.prototype.sayName = function () {
alert(this.name);
};
function SubType (name, age) {
//继承属性
SuperType.call(this, name);
this.age = age;
}
//继承方法
SubType.prototype = new SuperType();
//子类新定义的方法一定要在上面的继承代码之后,要不然新写的方法就没了
SubType.prototype.sayAge = function () {
alert(this.age);
}
var instance1 = new SubType("MirrorAvatar", 3);
instance1.numbers.push(33);
instance1.numbers; // "[1,2,3,33]"
instance1.sayName(); //MirrorAvatar
instance1.sayAge(); //3
var instance2 = new SubType("Cindy", 4);
instance2.numbers; //"[1,2,3]"
instance2.sayName(); //Cindy
instance2.sayAge(); //4
?
组合继承避免了原型链和借用构造函数的缺陷,融合了它们的优点,成为JavaScript中最常用的继承模式。而且,instanceof和isPrototypeOf()也能够用于识别基于组合继承创建的对象。
原文:http://mirroravatar.iteye.com/blog/2191749