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 中的对象是通过引用传递的,因此在您的示例中,变量 ab 指的是同一个对象。 Object.freeze 作用于对象本身,而不是引用,因此使用ab 引用它没有区别。这就像你只是设置一个属性一样:

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

JavaScript手撕前端面试题:手写new操作符 | 手写Object.freeze

JavaScript 对象操作

Object.freeze与 Object.seal的区别

Object.freeze

我可以从 object.freeze 导入一种方法吗