MDN 文档 Object.freeze()
作为通过防止初始化后对类进行任何更改来使类不可变的解决方案,如下所示:
class ExampleA {
constructor(x) {
this.x = x;
Object.freeze(this);
}
}
但是,我看到其他人通过使用 Object.defineProperty()
达到了相同的效果像这样:
class ExampleB {
constructor(x) {
Object.defineProperty(this, "x", {value: x});
}
}
乍一看,这两种方法似乎都实现了相同的目的,那就是我希望 this.x
是不可变的。最重要的是,使用 Object.defineProperty()
让我可以选择要使哪些属性变为不可变,而不是像 Object.freeze()
那样使所有内容都变为不可变。
所以我需要问:在实现不变性方面,首选方法是什么?通过使用 Object.defineProperty()
而不是 Object.freeze()
,我可能会错过任何副作用吗?
最佳答案
两者是完全不同的工具。 Object.freeze
在Object
级别浅层工作,而Object.defineProperty
在属性级别工作。两者都可以控制对象类型的可变性,但后者可以做更多的事情。浅层意味着,如果一个属性包含另一种对象类型,则该对象既不受 Object.freeze
影响,也不受 Object.defineProperty
影响,但保持可变。
由于使用这两种工具只能浅层地实现不变性,而深度不变性的成本很高,因此我建议将不变性视为一项策略,而不是明确强制执行它。
关于javascript - 对于不变性,使用 Object.defineProperty 和 Object.freeze 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42951392/