2017-07-03 56 views
0

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()他们正在从原型创建所有可枚举方法的副本,完全失去了原型的链接。

+2

从节的开头你链接到*“这方法将源代码合并到目标中:它修改目标,首先将source_1的所有可枚举属性(非继承)属性复制到它中,然后复制source_2的所有属性等等。最后,它返回目标。“*说'Object.assign'返回传递给它的第一个参数,也就是说你的应用程序实际上并没有克隆这个对象。 –

+0

你的代码根本不会做“克隆”。您没有在原型中使用Object.create,并且您不想在要克隆的对象上使用Object.getPrototypeOf,也不使用带有两个参数的Object.assign。所有这些都是重要的部分。 – Bergi

回答

3
var o2 = Object.assign(o1); 

等于:

var o2 = o1; 

作为Object.assign返回第一个参数。下面的参数被复制到第一个,所以你可以这样做:

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

你可以看到,他们除了原型等于...

+0

是的,关键是它没有返回一个新的对象。它正在改变这个论点。这很酷。我很困惑JS中的变异以及重新返回的结果。 –

+1

@EvanCarroll:对。因此他为什么使用'function clone(orig){return Object.assign({},orig); }作为克隆实现,而不是'function clone(orig){return Object.assign(orig); }'。 –

相关问题