javascript的不同扩展方法

时间:2013-09-02 16:57:06

标签: javascript underscore.js javascript-objects

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'
    }
};

方法A:

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

2 个答案:

答案 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()以要求参数,如果没有收到有效参数则会失败。其他两种方法都不会受到这种困扰。也许你正在使用的继承构造函数也不会受到这种困扰。