在函数原型中使用_.extend

时间:2014-03-20 21:58:21

标签: javascript underscore.js prototype extend

这些天我看到了很多这样的事情:

function Dog () {
    this.name = 'Fido';
}

_.extend(Dog.prototype, {
    bark: function() {
        return 'BARK, BARK!'
    },
    soilChothingWithDirtyPaws: function () {
        // Some intricated logic here
        return 'There, I did it!';
    }
});

但结果与下面的代码有什么不同?

function Dog () {
    this.name = 'Fido';
}
Dog.prototype = {
    bark: function() {
        return 'BARK, BARK!'
    },
    soilChothingWithDirtyPaws: function () {
        // Some intricated logic here
        return 'There, I did it!';
    }
}

我知道下划线的extend函数应该做什么,但我真的没有在对象的原型中做到这一点 - 当你可以用普通的老香草JS做到这一点,这意味着,我不明白为什么这里需要一个中间人。 我想知道我是否遗漏了一些非常整洁的东西。

这会带来什么好处吗?

如果有人清楚的话,那将是非常好的。非常感谢!

1 个答案:

答案 0 :(得分:6)

_.extend的定义如下,

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

所有这一切都是,从索引1的参数到结尾遍历所有元素的属性,并将其添加到传递给它的第一个参数。

因此,从技术上讲,你所做的事情会产生同样的效果,但会产生一些微妙的差异。

当你使用_.extend时,你正在扩充Dog.prototype对象,当你分配它时(就像在你的第二个例子中),你正在用其他对象替换Dog.prototype对象