题外话:
只有自己尝试写个框架,才有机会接触像原型、作用域、事件代理、缓存系统、定时器等深层知识。
司徒正美《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