【问题标题】:Errata in Exploring JS on Object.assign text?Exploring JS on Object.assign 文本中的勘误表?
【发布时间】:2017-07-03 18:08:45
【问题描述】:

Exploring JS Axel Rauschmayer Emanauten 是一本非常受欢迎的 ES6 书籍,他说,

如果希望克隆的原型与原版相同,可以使用 Object.getPrototypeOf() 和 Object.create():

function clone(orig) {
   const origProto = Object.getPrototypeOf(orig);
   return Object.assign(Object.create(origProto), orig);
}

这似乎不是真的,

var a = {a:1};
var o1 = Object.create(a);
Object.getPrototypeOf(o1); //shows {a:1} of course
var o2 = Object.assign(o1);
Object.getPrototypeOf(o2); // also shows {a:1}

那么为什么他们在克隆中说“与原始原型相同”?似乎Object.assign 已经给它提供了与原始原型相同的原型,而且似乎clone() 他们正在从原型创建所有可枚举方法的副本,完全失去了到原型的链接。

【问题讨论】:

  • 从您链接到的部分的开头 "此方法将源合并到目标中:它修改目标,首先将 source_1 的所有可枚举自己(非继承)属性复制到其中,然后是 source_2 的所有自己的属性,等等。最后,它返回目标。” 这一段说Object.assign 返回传递给它的第一个参数,即您的应用程序实际上并没有克隆对象。
  • 您的代码根本不像 clone 那样做。您没有将Object.create 与原型一起使用,并且您没有在要克隆的对象上使用Object.getPrototypeOf,并且您没有将Object.assign 与两个参数一起使用。所有这些都是重要的部分。

标签: javascript object ecmascript-6 prototype


【解决方案1】:
var o2 = Object.assign(o1);

等于:

var o2 = o1;

作为 Object.assign 返回第一个参数。以下参数被复制到第一个参数中,因此您可以这样做:

var o2=Object.assign({},o1);

你看到除了原型之外它们是相等的......

【讨论】:

  • 是的,所以关键是它没有返回一个新对象。它正在改变论点。这很酷。我对 JS 中的变异和重新返回的内容感到困惑。
  • @EvanCarroll:对。因此,为什么他使用function clone(orig) { return Object.assign({}, orig); } 作为克隆实现,而不是function clone(orig) { return Object.assign(orig); }
猜你喜欢
  • 2020-10-08
  • 2020-02-16
  • 2010-09-23
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 2020-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多