Javascript中的Object.Freeze

5

我该如何在一个对象上使用Object.Freeze?

以下是示例,我创建了a,复制了ab,然后冻结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)


你的代码只涉及一个对象。如果你将其冻结,它也将被冻结。 - JLRishe
2个回答

6

我相信您对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)


2
不错的答案。你也可以使用扩展运算符来实现 const b = {...a}; - Bohdan Khodakivskyi
真的!感谢您指出这一点。 - Bamieh
3
请注意,对象展开语法目前是 阶段 3 提案,尚未成为任何 ECMAScript 标准的一部分。 - Kara Brightwell
1
非常感谢你,你救了我的命!!! - Johnson

1
在Javascript中,对象是通过引用传递的,因此在您的示例中,变量ab指向同一个对象。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来实现的。

明白了!谢谢你,太感谢了 :) - Johnson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接