【问题标题】:Object.Freeze Javascript [duplicate]Object.Freeze Javascript [重复]
【发布时间】: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)

【问题讨论】:

  • 你这里的代码只涉及一个对象。如果你冻结它,它就会被冻结。

标签: javascript ecmascript-6


【解决方案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 来实现的。

【讨论】:

  • 明白了!谢谢一个战利品人:)
【解决方案2】:

我相信您误解了 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 标准的一部分。
  • 谢谢你,你救了我的命!!!
猜你喜欢
  • 1970-01-01
  • 2016-04-26
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 2021-07-23
  • 1970-01-01
相关资源
最近更新 更多