在 underscore.js 中扩展对象的最佳实践

Best practice to extend objects in underscore.js

我知道扩展对象是通过

_.extend(parent, child);

方法。

我在 Web 的不同地方看到人们在 underscore.js

中以特殊方式扩展对象
_.extend({}, this, child);

他们为什么这样做?

Underscore 的扩展方法覆盖传递给它的第一个参数。但大多数时候你不想要那样。您只需要另一个对象,其中第二个对象使用第一个对象的方法进行扩展。

因此您传递一个空对象作为结果的容器对象。

var grandChild = _.extend({}, parent, child);

举个例子:

myConfig = { name: 'bob' }

yourConfig = { name: 'sam' }

_.extend(myConfig, yourConfig);

现在,myConfig 被破坏了。我已经覆盖了 myConfig.name 的原始值,而且我再也找不回来了。

为了保留 myConfigyourConfig,我需要将两者组合成第三个对象:

myConfig = { name: 'bob' }

yourConfig = { name: 'sam' }

sharedConfig = _.extend({}, myConfig, yourConfig);

根据下划线documentation, _.extend方法的api是

_.extend(destination, *sources) 

第一个样本

_.extend(parent, child);

在此示例代码中,您实际上是将属性从子对象扩展到父对象。这里修改了父对象。

第二个样本

_.extend({}, parent, child);

如果您不想修改父对象,但仍需要父对象和子对象的属性。你可以用这个。在这里,您将父对象和子对象扩展到一个新对象。