在浏览underscorejs的方法列表时,我无法提醒,但我注意到一种我以前不记得在那里的方法:extendOwn
documentation for this method说明如下:
extendOwn _.extendOwn(destination,* sources) Alias : assign
与extend类似,但只将拥有属性复制到目标对象。
我理解.extend() 的使用方式及其作用...但对于我的生活,我无法理解它与 .extendOwn()的区别
我尝试使用.extend() ,然后使用 .extendOwn()来扩展一些对象,看看是否有明显可能发生的事情 - 但是似乎都产生了相同的结果。
var a = {
foo: false
};
var b = {
bar: true
};
// This will produce { foo: false, bar: true }; ..just like _.extend() would =\
_.extendOwn( a, b );
非常感谢对这个谜团的任何见解!
答案 0 :(得分:10)
“自有属性”是JS中的技术术语。对象自己的属性是它没有继承的属性。
这是一个简短的代码段,公开了extend
和extendOwn
的不同行为:
// lines have length
line = { length: 4 }
// planes have width and inherit length
plane = Object.create(line)
plane.width = 5
plane.length // 4
// making a cube object, using extend
cube = _.extend({ height: 6 }, plane)
cube.length // 4
// making a cube object, using extendOwn
notACube = _.extendOwn({ height: 6 }, plane)
notACube.length // undefined
如您所见,extendOwn
仅复制了直接在源上定义的属性,而extend
也复制了在其原型链中定义的属性。另请注意_.has
的对称性:
_.has(plane, 'width') // true
_.has(plane, 'length') // false
答案 1 :(得分:8)
所以对于任何想知道的人来说,找到答案的好地方就在这里:https://github.com/jashkenas/underscore/search?q=extendOwn&type=Issues&utf8=%E2%9C%93
<强>更新强>
对于任何有兴趣的人,答案是extendOwn
与Object.assign
是同义词,实现方式略有不同。 Underscorejs只是添加了一个替代品。他们调用assign
(_.assign
是_.extendOwn
的别名),而不是将_.assign
替换为Underscorejs中的新实现并将其称为_.extendOwn
。
这种命名约定的原因是可以理解的,但有点令人困惑。你看,Object.assign
是ES6的方法/逻辑的正式名称,我们称之为“扩展”(由jQuery和Underscore等工具调用)。
The decision by the Underscore team是他们决定调用主/父方法extendOwn
来遵守他们自己的内部标准。命名主要方法_.assign
(对于Underscore的团队)对他们来说是直观的,它会混淆“扩展”的作用。通过调用它extendOwn
,他们说这个方法与“扩展”做同样的事情,但它基于ES6的这个功能的实现,称为“assign”。
基本上 - 他们在这里遇到的是一个悖论,他们需要做出决定。要么他们坚持我们所知的“扩展”惯例,要么他们允许“分配” - 这将与原始名称冲突(这也可能开始引起人们质疑为什么他们仍然会将另一种方法称为“扩展”而不是而是assignSomethinghere
。
长话短说 - extendOwn
是ES6的Object.assign
的Underscore版本。他们只是将它命名为extendOwn
以使其与相同的命名约定保持一致,命名为extend。