【发布时间】: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