Object.Freeze Javascript [重复]
Posted
技术标签:
【中文标题】Object.Freeze Javascript [重复]【英文标题】:Object.Freeze Javascript [duplicate] 【发布时间】:2018-05-10 18:56:06 【问题描述】:如何只在一个对象上设置 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)
【问题讨论】:
你这里的代码只涉及一个对象。如果你冻结它,它就会被冻结。 【参考方案1】:我相信您误解了 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;
使用扩展运算符
真的!感谢您强调这一点
请注意,对象传播目前是 Stage 3 proposal,还不是任何 ECMAScript 标准的一部分。
谢谢你,你救了我的命!!!【参考方案2】:
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
来实现的。
【讨论】:
明白了!谢谢一个战利品人:)以上是关于Object.Freeze Javascript [重复]的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript锁定对象的属性 Object.freeze