Javascript _u.extend/u.assign的目的?

Javascript _u.extend/u.assign的目的?,javascript,underscore.js,lodash,Javascript,Underscore.js,Lodash,我看过很多教程或代码示例,其中开发人员使用了下划线方法或Lodash方法,而简单地添加属性就足够了,这总是让我困惑,使用extend/assign而不是简单地添加属性有什么好处?在很多情况下,我可以看到使用这些方法的好处,例如,从另一个对象添加多个属性时,但大多数情况下,我看到使用这些方法,如下面的示例中所示,我看不到任何好处 以下代码是否有我不知道的优点,而不是分配属性 例如,上面的代码不能这样重写: Weather.prototype.fetch = function(...){...}

我看过很多教程或代码示例,其中开发人员使用了下划线方法或Lodash方法,而简单地添加属性就足够了,这总是让我困惑,使用extend/assign而不是简单地添加属性有什么好处?在很多情况下,我可以看到使用这些方法的好处,例如,从另一个对象添加多个属性时,但大多数情况下,我看到使用这些方法,如下面的示例中所示,我看不到任何好处

以下代码是否有我不知道的优点,而不是分配属性

例如,上面的代码不能这样重写:

Weather.prototype.fetch = function(...){...}

或者说这有负面影响吗?

它的存在与jQuery的原因相同(包括一个),它与性能无关:将一个对象的属性添加到另一个对象,从而用另一个对象扩展一个对象。允许使用
customizer
函数对合并过程进行更细粒度的控制

扩展对象有两种用途,其中一种是jQuery开发人员在:

我们可以而且应该对上面的代码进行改进,即公开默认插件设置。这一点很重要,因为它使插件用户可以很容易地用最少的代码覆盖/自定义插件。这就是我们开始利用函数对象的地方

// Plugin definition.
$.fn.hilight = function( options ) {

    // Extend our default options with those provided.
    // Note that the first argument to extend is an empty
    // object – this is to keep from overriding our "defaults" object.
    var opts = $.extend( {}, $.fn.hilight.defaults, options );

    // Our plugin implementation code goes here.

};

// Plugin defaults – added as a property on our plugin function.
$.fn.hilight.defaults = {
    foreground: "red",
    background: "yellow"
};
在上面的示例中,您可以清楚地看到,with正在处理一个具有属性的预设对象,该对象需要被具有未知属性的未知对象扩展甚至覆盖,因为该对象不受插件开发人员的控制


有时我们根本不知道扩展对象上有哪些属性,有时它只是让事情变得更可读,有时手动操作非常麻烦,尤其是在需要深度合并的情况下

另一个应用程序是要模拟简单继承层次结构的应用程序:

// very trivial example:
var Super = { superFoo: function() {} };
var Sub1 =   { sub1Foo:   function() {} };
var Sub2 =   { sub2Foo:   function() {} };

$.extend(Sub1, Super) // now Sub1 has Super powers
$.extend(Sub2, Super) // now Sub2 has Super powers too

在许多情况下,使用
Object.assign()
(或库提供的等效工具)可以让人以更实用的风格进行书写。您可以在一个大表达式中完成所有操作,而不是使用多个语句向对象添加单个属性

程序性:

function doThing(options) {
    options.x = 5;
    return _doThing(options);
}
功能性:

function doThing(options) {
    _doThing(Object.assign(options, {x: 5}));
}
此外,如果与空对象一起使用,它会习惯性地创建一个浅层副本,以避免以可能会混淆调用者的方式干扰传入的对象:

function doThing(options) {
    _doThing(Object.assign({}, options, {x: 5}));
}

这可能只是一个习惯用法,使用相同的样式将一个属性添加为多个属性。这是有道理的,也是我所想的,我想确认我没有错过一些与性能或bug相关的好处
.extend(Weather.prototype…
读取的内容与扩展
Weather
对象的原型完全相同。@Mathletics唯一的问题是“extend”JS/ES并没有定义这个术语。对于其他命令式语言,它的含义有所不同。@zerkms对于第一点,这就是为什么在这么多附加库中定义了
extend
。对于第二点,您是指扩展类和扩展原型之间的区别吗?
function doThing(options) {
    _doThing(Object.assign({}, options, {x: 5}));
}