我见过相当多的教程或代码示例,开发人员使用下划线的_.extend方法或Lodash的_.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(...){...}还是说这是负面的呢?
发布于 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 ={前景:“红色”,背景:“黄色”};
在上面的示例中,您可以清楚地看到,处理的是一个具有属性的预设对象,它需要由一个具有未知属性的未知对象进行扩展甚至覆盖,因为该对象不在插件开发人员的控制范围之内
有时我们根本不知道扩展对象上有哪些属性,有时它只会让事情更具可读性,有时手动操作会很麻烦,特别是当你需要深度合并的时候。
另一个应用程序是您想要模拟简单继承层次结构的应用程序:
// 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发布于 2015-11-11 11:51:45
在许多情况下,使用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}));
}https://stackoverflow.com/questions/24806821
复制相似问题