我如何在一个对象上给出一个Object.Freeze?
下面是我创建a的示例,我在b中复制了a,冻结了b,并尝试为a重新分配一个值。但这已经不可能了。为什么?如何只对一个对象执行freeze?
谢谢!
let a = { "teste" : [1,2,3] }
// I want 'b' freezed
const b = a;
Object.freeze(b);
a.teste = [4,5,6]
console.log(a)
发布于 2017-11-27 13:57:21
我相信你误解了javascript中引用的概念。对象在javascript中引用,所以当您这样做时
const b = a;基本上,您是为b分配一个引用a的值,以使您的代码正常工作,并按照您的意愿进行实际的“复制”,您需要克隆对象而不是传递引用。
您可以使用Object.assign({}, ...)将对象克隆到新对象中。(请注意,这不是深入的克隆,但它应该让您开始)
let a = { "teste" : [1,2,3] }
// I want 'b' freezed
const b = Object.assign({}, a);
Object.freeze(b);
a.teste = [4,5,6]
console.log(a)
发布于 2017-11-27 14:00:44
Javascript中的对象是通过引用传递的,因此在您的示例中,变量a和b引用同一个对象。Object.freeze工作于对象本身,而不是引用,因此无论使用a还是b引用它都没有区别。这与您刚刚设置了一个属性一样:
let a = { "test" : [1,2,3] }
const b = a;
b.test = [4,5,6]
console.log(a)如果您想在不影响b的情况下冻结或修改a,则需要首先克隆它。其中一种方法是使用Object.assign
let a = { "test" : [1,2,3] }
const b = Object.assign({}, a);
Object.freeze(b);
a.test = [4,5,6]
console.log(a)这是通过将a的所有属性复制到一个空对象,然后将其分配给b来实现的。
https://stackoverflow.com/questions/47512580
复制相似问题