组合继承
核心思想:使用借用构造函数的技术实现实例属性的继承,使用原型链实现原型属性和方法的继承。
function SuperType(name){ this.name = name; this.colors = ["red", "blue", "green"]; } SuperType.prototype.sayName = function(){ alert(this.name); }; function SubType(name, age){ SuperType.call(this, name); //借用构造函数,继承了SuperType,拥有name,colors属性,第一次调用 this.age = age; //自定义实例属性 } SubType.prototype = new SuperType(); //构造原型链,继承原型属性和方法 SubType.prototype.constructor=SubType; SubType.prototype.sayAge = function(){ //向原型中添加方法 alert(this.age); }; var instance1 = new SubType("Nicholas", 29); //第二次调用 instance1.colors.push("black"); alert(instance1.colors); //"red,blue,green,black" instance1.sayName(); //"Nicholas"; instance1.sayAge(); //29 var instance2 = new SubType("Greg", 27); alert(instance2.colors); //"red,blue,green" instance2.sayName(); //"Greg"; instance2.sayAge(); //27
实际上,使用SubType.prototype = new SuperType();SubType将会继承SuperType实例对象的name,colors属性,虽然name没有被创建
delete instance1.name; alert(instance1.name); //undefined,new SuperType()中没有传入实参
因此造成了一个问题,SubType.prototype上会存在不必要的,多余的属性。如name,colors属性同时存在于SubType.prototype和SubType中。
寄生组合式继承
核心思想:用借用构造函数技术继承超类型属性,用inheritPrototype方法继承超类型原型的方法。该方法详细内容可查找相关资料。
该方法的好处在于只调用了一次SuperType构造函数,并且SubType.prototype上没有多余的属性。
该方法是引用类型最理想的继承方式。
参考书籍:javascript高级程序设计
原文:http://www.cnblogs.com/pick7/p/5518212.html