2016-05-04 3 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 в зависимости от того, что вы предпочитаете. Если у Вас есть более сложный/глубокий объект и нужно мутировать эти глубокие свойства, я бы, наверное, просто использовать что-то вроде Hacky

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

JSON.deserialize/serialize? Вы имеете в виду JSON.parse/stringify? – Andy

+0

yep, brainfart – Montagist

1

Вы слегка правы, это проблема передачи по ссылке или пропуска по значению. В действительности, передача по ссылке происходит в первой строке. Оба mutableCopy и immutableData указывают на тот же объект на куче 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