首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >_.tend/_.assign的用途?

_.tend/_.assign的用途?
EN

Stack Overflow用户
提问于 2014-07-17 22:50:00
回答 2查看 1.8K关注 0票数 6

我见过相当多的教程或代码示例,开发人员使用下划线的_.extend方法或Lodash的_.assign方法,而简单地添加属性就足够了,这总是让我感到困惑,使用扩展/赋值而不是简单地添加属性有什么好处?有很多时候,我可以看到使用这些方法的好处,例如,当从另一个对象添加多个属性时,但最常见的情况是,我在下面的示例中看到它的使用,而我看不到任何好处。

对于下面的代码,有没有我不知道的好处,而不是赋值属性?

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

代码语言:javascript
复制
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 )
     });
   }
});

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

代码语言:javascript
复制
Weather.prototype.fetch = function(...){...}

还是说这是负面的呢?

EN

回答 2

Stack Overflow用户

发布于 2015-05-09 04:37:16

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

扩展对象有两种用途,其中一种是由writing plugins上的jQuery开发人员说明的

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

//插件定义。$.fn.hilight = function( options ){ //使用提供的选项扩展我们的默认选项。//请注意,要扩展的第一个参数是一个空的//对象-这是为了避免覆盖我们的“默认”对象。$.fn.hilight.defaults opts = var ( {},var,options );//我们的插件实现代码在这里。};// Plugin defaults -添加为插件函数的属性。$.fn.hilight.defaults ={前景:“红色”,背景:“黄色”};

在上面的示例中,您可以清楚地看到,处理的是一个具有属性的预设对象,它需要由一个具有未知属性的未知对象进行扩展甚至覆盖,因为该对象不在插件开发人员的控制范围之内

有时我们根本不知道扩展对象上有哪些属性,有时它只会让事情更具可读性,有时手动操作会很麻烦,特别是当你需要深度合并的时候。

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

代码语言:javascript
复制
// 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
EN

Stack Overflow用户

发布于 2015-11-11 11:51:45

在许多情况下,使用Object.assign() (或库提供的等价物)可以让人以更函数式的风格编写代码。您可以在一个大表达式中执行所有操作,而不是使用多个语句将单个属性添加到对象中。

程序:

代码语言:javascript
复制
function doThing(options) {
    options.x = 5;
    return _doThing(options);
}

功能性:

代码语言:javascript
复制
function doThing(options) {
    _doThing(Object.assign(options, {x: 5}));
}

此外,如果与空对象一起使用,它会惯用地创建一个浅层副本,以便不会以可能使调用者感到困惑的方式干扰传入的对象:

代码语言:javascript
复制
function doThing(options) {
    _doThing(Object.assign({}, options, {x: 5}));
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24806821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档