JavaScript里的继承方式在很多书上分了很多类型和实现方式,大体上就是两种:类继承(对象冒充)和原型继承。
类继承(对象冒充):在函数内部定义自身的属性的方法,子类继承时,用call或apply实现对象冒充,把类型定义的东西都复制过来,这样的继承子类与父类并没有多少关联,不互相影响,有利于保护自身的一些私有属性。
原型继承:每个函数都有自己的原型(prototype)属性,这个属性是在生成实例对象时自动创建的。它本身又是一个对象,拥有能够在实例间共享的属性和方法。而实例本身的属性和方法,则包含在构造函数中。换句话说,构造函数内部的属性和方法,在经过实例化后都成为了本地的属性和方法,而原型(prototype)中的属性和方法在实例中只是一种引用,因此能够被多个实例共享。
两者各有利弊,实际应用中多是两者混合应用。
以下就通过混合两者的示例去理解:
function A(x) {
this.x = x;
}
A.prototype.a = "a";
function B(x, y) {
this.y = y;
A.call(this,x);//类继承
}
B.prototype.b1 = function() {
alert("b1");
}
B.prototype = new A();//原型继承
B.prototype.b2 = function() {
alert("b2");
}
B.prototype.constructor = B;
var obj = new B(1, 3);