ECMAScript继承是通过原型链来继承的。基本思想是利用原型来让一个引用类型继承另一个引用类型的属性和方法,使原型变为另一个对象的实例。通过原型链实现继承时,不能使用对象字面量创建原型方法,避免重写原型链。
原型链继承的问题
1.原型中的引用类型的值都会被共享。
2.在创建子类型的实例时,无法在不影响所有对象实例的情况下,向超类型的构造函数传递参数。意思是如果向超类型的构造函数传递参数,则会影响到所有该对象的实例。
借用构造函数
为解决上面的问题,可以使用借用构造函数的概念,思想是在子类型构造函数的内部调用超类型构造函数。使用apply或call方法。这种方式的缺点是无法实现方法的复用。
组合继承
比较有效的方式是结合原型链继承与构造函数继承。思路是使用原型链继承原型的属性和方法,借用构造函数(apply或call方法)继承实例属性。这样,即通过原型上定义方法来实现函数复用,又能保证每个实例都有自己独立的属性。
原型式继承
eg:
function object(o){
function F(){};
F.prototype = o;
return new F();
}
寄生式继承
eg:
function aobject(o){
var clone = object(o); //创建一个新对象,这个对象的原型属性是o
clone.method = function(){ //给对象添加方法来增强对象
alert('aa');
}
return clone; //返回这个新对象
}
寄生组合式继承
思路是借用构造函数来继承属性,通过原型链混成方式来继承方法,也就是子类型的原型继承超类型的原型方法和属性。
eg:
function inheritPrototype(subtype,supertype){
var prototype = object(super.prototype); // 创建超类型原型的一个副本
prototype.constructor = subtype; //给副本添加construtor属性,弥补因重写原型而失去的默认的constructor属性
subtype.prototype = prototype; //将新创建的副本赋值给子类型的原型
}
使用组合式继承是最有效的方法。
总结自:《javascript 高级程序设计》