在 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
的原始值,而且我再也找不回来了。
为了保留 myConfig
和 yourConfig
,我需要将两者组合成第三个对象:
myConfig = { name: 'bob' }
yourConfig = { name: 'sam' }
sharedConfig = _.extend({}, myConfig, yourConfig);
根据下划线documentation,
_.extend方法的api是
_.extend(destination, *sources)
第一个样本
_.extend(parent, child);
在此示例代码中,您实际上是将属性从子对象扩展到父对象。这里修改了父对象。
第二个样本
_.extend({}, parent, child);
如果您不想修改父对象,但仍需要父对象和子对象的属性。你可以用这个。在这里,您将父对象和子对象扩展到一个新对象。
我知道扩展对象是通过
_.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
的原始值,而且我再也找不回来了。
为了保留 myConfig
和 yourConfig
,我需要将两者组合成第三个对象:
myConfig = { name: 'bob' }
yourConfig = { name: 'sam' }
sharedConfig = _.extend({}, myConfig, yourConfig);
根据下划线documentation, _.extend方法的api是
_.extend(destination, *sources)
第一个样本
_.extend(parent, child);
在此示例代码中,您实际上是将属性从子对象扩展到父对象。这里修改了父对象。
第二个样本
_.extend({}, parent, child);
如果您不想修改父对象,但仍需要父对象和子对象的属性。你可以用这个。在这里,您将父对象和子对象扩展到一个新对象。