【发布时间】:2017-08-14 13:15:07
【问题描述】:
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.defineProperty() 让我可以选择哪些属性使不可变而不是像 Object.freeze() 那样使所有内容不可变。 "
Object.defineProperty()也可以做other 可能有用的事情。 (顺便说一句,您知道即使在冻结对象之后,如果它的属性引用其他对象,这些对象仍然可以更改,除非它们也被冻结?)
标签: javascript ecmascript-6 immutability