2017-07-03 55 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); }'。 –