我该如何在一个对象上使用Object.Freeze?
以下是示例,我创建了a
,复制了a
到b
,然后冻结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)
我该如何在一个对象上使用Object.Freeze?
以下是示例,我创建了a
,复制了a
到b
,然后冻结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)
我相信您对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)
const b = {...a};
。 - Bohdan Khodakivskyia
和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
来实现的。