我已经看过很多教程或代码示例,其中开发人员使用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(...){...}
或者对此有否定?
答案 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}));
}