2016-05-04 4 views
0

追加のライブラリを使用せずに、オブジェクトの不変なコピーを作成し、変更可能なコピーを保持する方法を教えてください。JSでオブジェクトの可変かつ不変のコピーを作成する方法

var mutableCopy = immutableData; 

Object.freeze(immutableData); 

mutableCopy.newProp = 'mutated!'; 

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

Object.freeze()も参照によってオブジェクトをフリーズするようです。

オブジェクトの変更可能で不変なコピーを作成するにはどうすればよいですか?

+0

が、これは深くネストされたオブジェクトである、またはそれは深い性質に関する唯一のレベルであるようなハックものを使用したいです? – Montagist

+0

2レベル深くネストされていますが、最初のレベルでプロパティを変更したいだけです – Himmel

答えて

1
var objCopy = {}; 

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

あなたが好きなようにobject.freeze。あなたは、より複雑な/深いオブジェクトをしましたし、それらのより深い性質を変異させる必要がある場合、私はおそらくちょうど

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

JSON.deserialize/serialize? JSON.parse/stringifyを意味しますか? – Andy

+0

うん、brainfart – Montagist

1

これでは、参照渡しと値渡しの問題が少し間違っています。実際には、参照渡しは最初の行で行われます。 mutableCopyimmutableDataの両方がJSヒープ上の同じオブジェクトを指しています。

あなたがすべきことは、古いオブジェクトの複製である新しいオブジェクトを作成することです。次に、新しいオブジェクトをフリーズすると、変更を防止しながら、変更可能なコピーとして古いオブジェクトが残されます。

var newObj = {} 
for (var key in obj) { 
    if (obj.hasOwnProperty(key)) { 
     newObj[key] = obj[key]; 
    } 
} 

Object.freeze(newObj); 

もちろん、新しいオブジェクトに変更可能なコピーを作成し、古いオブジェクトを変更可能なコピーに変更することができます。

+0

'Object.freeze'がなくても、ここでは' newObj'のプロパティを変更することができ、 'obj'のプロパティは変わりません。右? – Himmel

+0

'Object.freeze'を使用する必要はありません。 – Himmel

+0

あなたは正しいです。コピーした後に 'obj'か' newObj'を修正すると、もう一方は変更されません。 – Strikeskids

関連する問題