0

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;

方法 B(来自 underscore.js):

_.extend = function(obj) {
    each(slice.call(arguments, 1), function(source) {
        if (source) {
            for (var prop in source) {
                obj[prop] = source[prop];
            }
        }
    });
    return obj;
};

方法 C(来自 LiveScript):

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看起来更简单。为什么要麻烦地一次复制一个对象,一个属性?

4

2 回答 2

1

是的,方法 A 看起来更简单,但使用它你只能从一个对象继承。如果您希望您的子类也继承自怎么办BaseClassOther。在这种情况下,您应该选择方法 B(也继承自BaseClassOther)。您不能 SubClass.prototype = new BaseClassOther(); 再次这样做,这将覆盖原型属性。

请查看https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create

于 2013-09-02T18:00:25.120 回答
0

在方法 A 中,在其他情况下,BaseClass() 可能被编写为需要一个参数,如果它没有收到一个有效的参数则失败。其他两种方法不受此困扰。也许您正在使用的继承构造函数也不会受到此困扰。

于 2013-09-02T17:46:06.773 回答