第一种,纯原型链式继承:
function SuperClass() {
this.name = 'SuperClass';
}
SuperClass.prototype.showName = function() {
return this.name;
}
function SubClass() {
this.subName = 'SubClass';
}
SubClass.prototype = new SuperClass();
var obj = new SubClass();
obj,showName();
这种方法简单方便,但是它实现的本质是重写原型对象,代之以一个新类型的实例。缺点是引用类型的原型属性会被所有的实例共享,所以现在实例的属性也变为了原型属性,这样对实例的属性变更也会引起原型实例的变更。
第二种构造器继承(经典继承):
function SuperClass() {
this.idList = [1,2,3];
}
function SubClass() {
SuperClass.call(this);
}
var instance1 = new SubClass();
和所有的构造器继承一样,没办法复用,因为所有的方法都写在了构造器里面。
第三种,组合式继承:
function SuperClass(name) {
this.name = name;
this.idList = [1,2,3];
}
SuperClass.prototype.sayName = function() {
return this.name;
}
function SubClass(name, age) {
SuperClass.call(this, name);
}
SubClass.prototype = new SuperClass();
SubClass.prototype.constructor = SubClass();
比较好,但是SuperClass会被调用两次。
underscore中继承的实现:
// Extend a given object with all the properties in passed-in object(s).
_.extend = function(obj) {
each(slice.call(arguments, 1), function(source) {
if (source) {
for (var prop in source) {
obj[prop] = source[prop];
}
}
});
return obj;
};
YUI实现:
function extend(Child, Parent) {
var F = function(){};
F.prototype = Parent.prototype;
Child.prototype = new F();
Child.prototype.constructor = Child;
Child.uber = Parent.prototype;
}