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

Jon*_*ard 13 extend underscore.js

在浏览underscorejs的方法列表时,我不由自主地注意到一种我以前不记得存在的方法:extendOwn

此方法文档说明如下:

extendOwn _.extendOwn(destination,*sources)别名: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 );
Run Code Online (Sandbox Code Playgroud)

任何洞察这个谜团将不胜感激!

joh*_*cip 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
Run Code Online (Sandbox Code Playgroud)

如您所见,extendOwn只复制了直接在源上定义的属性,同时extend还复制了沿其原型链定义的属性.还要注意对称性_.has:

_.has(plane, 'width')   // true
_.has(plane, 'length')  // false
Run Code Online (Sandbox Code Playgroud)


Jon*_*ard 8

所以对于任何想知道的人来说,找到答案的好地方就在这里:https: //github.com/jashkenas/underscore/search?q = extendOwn&type = Issues&utf8 =%E2%9C%93

更新

对于任何感兴趣的人来说,答案是与实现略有不同的extendOwn同义词Object.assign.Underscorejs只是添加了一个替代品.他们不是assign将新实现覆盖到Underscorejs并调用它_.assign,而是调用它_.extendOwn(_.assign作为别名_.extendOwn).

这种命名约定的原因是可以理解的,但有点令人困惑.你知道,Object.assignES6是我们所知的"扩展"方法/逻辑的正式名称(由jQuery和Underscore等工具调用).

Underscore团队的决定是,他们决定将主要/父母方法称为extendOwn遵守自己的内部标准.命名主要方法_.assign(对于Underscore的团队)对他们来说是直观的,它会混淆"扩展"的作用.通过调用它extendOwn,他们说这个方法与"扩展"做同样的事情,但是基于ES6的这个功能的实现,称为"assign".

基本上 - 他们在这里遇到的是一个悖论,他们需要做出决定.要么他们坚持我们所知的"扩展"惯例,要么他们允许"分配" - 这将与原始名称冲突(这也可能开始引起人们质疑为什么他们仍然会将另一种方法称为"扩展"而不是assignSomethinghere代替).

长话短说 - extendOwn是ES6的Underscore版本Object.assign.他们只是命名它extendOwn以使其与相同的命名约定保持一致,命名为extend.

  • 我猜想[MDN上的``hasOwnProperty`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty)现在可以正确阅读. (4认同)
  • 这并不能回答问题。您已经介绍了事物命名的历史,但没有解释这两种方法之间的功能差异。 (2认同)