javascript - 在函数原型(prototype)中使用 _.extend

标签 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 是什么函数应该做的,但我真的不明白在对象的原型(prototype)中这样做的意义——当你可以用普通的旧 Vanilla JS 做到这一点时,这意味着,我不明白为什么需要一个中间人这里。 我想知道我是否遗漏了一些非常整洁的东西。

这有什么好处吗?

如果有人能解决问题,那就太好了。非常感谢!

最佳答案

_.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 对象与其他对象。

关于javascript - 在函数原型(prototype)中使用 _.extend,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22546017/

相关文章:

javascript - 针对特定条件抑制页面上的 JavaScript 错误

javascript - 引用对象数组的所有值

javascript - Underscore.js 对象-对象映射器?

javascript - 如何按照这种模式将 Javascript 对象的所有函数复制到另一个对象?

javascript - 什么是 javascript 中的代理原型(prototype)交换?

javascript - 在这种情况下如何进行原型(prototype)继承?

javascript - d3.js nvd3 x 轴上的日期 : only some dates are show

javascript - 正则表达式 : match known number

Javascript 数组声明 : new Array(), new Array(3), ['a' , 'b' , 'c' ] 创建行为不同的数组

javascript - backbone.js - 事件只触发一次