如何在JS中创建对象的可变AND不可变副本

时间:2016-05-04 23:05:48

标签: javascript

不使用任何其他库,我如何创建对象的不可变副本并保留可变副本。

var mutableCopy = immutableData;

Object.freeze(immutableData);

mutableCopy.newProp = 'mutated!';

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

似乎Object.freeze()也会通过引用冻结对象。

如何创建对象的可变且不可变的副本?

2 个答案:

答案 0 :(得分:3)

var objCopy = {};

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

和object.freeze无论你喜欢什么。如果你有一个更复杂/更深的对象并且需要改变那些更深层的属性,我可能只是使用像hacky这样的东西

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

答案 1 :(得分:1)

你是略微正确的,这是一个传递引用和传值的问题。实际上,传递参考发生在第一行。 mutableCopyimmutableData都指向JS堆上的同一个对象。

您应该做的是创建一个与旧对象重复的新对象。然后,冻结新对象将使旧对象保留为可变副本,同时防止修改。

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

Object.freeze(newObj);

当然,您可以将新对象设为可变副本,将旧对象设为不可变副本。