2016-05-04 11 views
0

erzeugt Ohne wie ich irgendwelche zusätzlichen Bibliotheken verwende, wie ich kann ich eine unveränderliche Kopie eines Gegenstandes verursachen und eine veränderbare Kopie behalten.Wie man veränderbare UND unveränderliche Kopie des Gegenstandes in JS

var mutableCopy = immutableData; 

Object.freeze(immutableData); 

mutableCopy.newProp = 'mutated!'; 

console.log(mutableCopy.hasOwnProperty('newProp')); // false 

Es scheint, dass Object.freeze() auch Objekte durch Verweis einfriert.

Wie kann ich eine veränderbare und unveränderbare Kopie eines Objekts erstellen?

+0

Ist das ein tief verschachteltes Objekt, oder ist es nur eine Ebene tief in Bezug auf die Eigenschaften ? – Montagist

+0

geschachtelt 2 Ebenen tief, aber ich möchte nur Eigenschaften in der ersten Ebene mutieren – Himmel

Antwort

1
var objCopy = {}; 

for (var propKey in objToClone) 
    objCopy[ propKey ] = objToClone[ propKey ]; 

Und object.freeze was auch immer Sie bevorzugen. Wenn Sie ein komplexere/tiefes Objekt haben und müssen diese tieferen Eigenschaften mutieren, würde ich wahrscheinlich verwende nur etwas hacky wie

var objCopy = JSON.parse(JSON.stringify(objToClone)); 
+0

JSON.deserialize/serialisieren? Meinst du JSON.parse/stringify? – Andy

+0

yep, brainfart – Montagist

1

Sie sind leicht in diesem Problem ist ein Problem von Pass-by-Referenz vs Pass-by-Wert. In der Realität tritt das Pass-by-Reference in der ersten Zeile auf. Sowohl mutableCopy als auch immutableData verweisen auf dasselbe Objekt im JS-Heap.

Was Sie tun sollten, ist ein neues Objekt, das ein Duplikat des alten ist. Durch das Einfrieren des neuen Objekts wird das alte Objekt als veränderliche Kopie beibehalten, während Änderungen verhindert werden.

Sie können natürlich das neue Objekt als veränderbare Kopie und das alte als das unveränderliche Objekt festlegen.

+0

Auch ohne die 'Object.freeze' konnte ich hier die Eigenschaften von' newObj' ändern, und die Eigenschaften von 'obj' würden sich immer noch nicht ändern, Recht? – Himmel

+0

Sieht so aus, als müsste ich 'Object.freeze' nicht verwenden. – Himmel

+0

Sie haben Recht. Wenn Sie nach dem Kopieren entweder 'obj' oder' newObj' ändern, ändert sich die andere nicht. – Strikeskids

Verwandte Themen