underscorejs - extendOwn vs extend之间有什么区别?

时间:2015-03-12 18:21:48

标签: underscore.js extend

在浏览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 );

非常感谢对这个谜团的任何见解!

2 个答案:

答案 0 :(得分:10)

“自有属性”是JS中的技术术语。对象自己的属性是它没有继承的属性。

这是一个简短的代码段,公开了extendextendOwn的不同行为:

// 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

<强>更新

对于任何有兴趣的人,答案是extendOwnObject.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。