_.extend / _。assign的目的?

时间:2014-07-17 14:50:00

标签: javascript underscore.js lodash

我已经看过很多教程或代码示例,其中开发人员使用Underscore的_.extend方法或Lodash的_.assign方法,只需添加属性就足够了,它总是让我困惑,什么使用extend / assign而不是简单地添加属性的好处是什么?有很多次我可以看到使用这些方法的好处,例如从另一个对象添加多个属性时,但我经常看到它在下面的示例中使用,我看不到任何好处。

我是否知道以下代码而不是分配属性?

http://tech.pro/tutorial/1734/building-decoupled-javascript-applications-with-postaljs

var Weather = function() {
   this.channel = postal.channel( "weather" );
   this.channel.subscribe( "fetch", this.fetch ).withContext( this );
};

_.extend(Weather.prototype, {
 fetch: function( city ) {
     $.ajax({
         url: "http://openweathermap.org/data/2.1/find/name?q=" + city + "&units=imperial",
         dataType: "jsonp",
         success: _.bind(function( data ) {
             this.channel.publish( "fetched", data.list[ 0 ] );
         }, this )
     });
   }
});

例如,上述代码无法重写:

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

或者对此有否定?

2 个答案:

答案 0 :(得分:1)

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

扩展对象有几个用途,其中一个由jQuery开发人员在writing plugins上说明:

  

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

// 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"
};

在上面的示例中,您可以清楚地看到正在处理具有属性的预设对象,这些属性需要由具有未知属性的未知对象进行扩展甚至覆盖,因为该对象不受插件开发人员的控制< / p>

有时我们根本不知道扩展对象上有哪些属性,有时它只会使事情更具可读性,有时只是手动执行它很麻烦,尤其是在需要深度合并时。

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

// 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

答案 1 :(得分:0)

在许多情况下,使用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}));
}