JavaScript中的扩展方法有什么区别?
假设我们有以下课程:
var BaseClass = function() {
this.class_name = 'BaseClass';
this.foo = function() {
return 'foo';
}
this.sub = {
moreStuff: 'weeee'
}
};
BaseClass.prototype.bar = function () {
return 'To be or not to be';
}
var SubClass = function() {
this.class_name = 'SubClass';
this.bar = function() {
return 'bar';
}
this.sub = {
moreStuff: 'wooohooo'
}
};
SubClass.prototype = new BaseClass();
SubClass.prototype.constructor = SubClass;
_.extend = function(obj) {
each(slice.call(arguments, 1), function(source) {
if (source) {
for (var prop in source) {
obj[prop] = source[prop];
}
}
});
return obj;
};
function extend$(sub, sup){
function fun(){}
fun.prototype = (sub.superclass = sup).prototype;
(sub.prototype = new fun).constructor = sub;
if (typeof sup.extended == 'function') sup.extended(sub);
return sub;
}
方法A看起来更简单。为什么要经历一次复制对象,一个属性的麻烦?
答案 0 :(得分:1)
是的,方法A看起来更简单,但使用它只能从一个对象继承。如果您希望SubClass也从BaseClassOther
继承,该怎么办?在这种情况下,您应该选择方法B(也从BaseClassOther
继承)。
你做不到
SubClass.prototype = new BaseClassOther();
这将覆盖原型属性。
请查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create
答案 1 :(得分:0)
在方法A中,在其他情况下,可能会编写BaseClass()以要求参数,如果没有收到有效参数则会失败。其他两种方法都不会受到这种困扰。也许你正在使用的继承构造函数也不会受到这种困扰。