Exploring JS属于Axel Rauschmayer先生Emanauten,一个非常流行的书ES6说,勘探Object.assign文本中的JS勘误?
如果你想克隆有相同的原型,原来,你可以使用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'返回传递给它的第一个参数,也就是说你的应用程序实际上并没有克隆这个对象。 –
你的代码根本不会做“克隆”。您没有在原型中使用Object.create,并且您不想在要克隆的对象上使用Object.getPrototypeOf,也不使用带有两个参数的Object.assign。所有这些都是重要的部分。 – Bergi