javascript - 对于不变性,使用 Object.defineProperty 和 Object.freeze 有什么区别?

标签 javascript ecmascript-6 immutability

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.freezeObject 级别浅层工作,而Object.defineProperty 在属性级别工作。两者都可以控制对象类型的可变性,但后者可以做更多的事情。浅层意味着,如果一个属性包含另一种对象类型,则该对象既不受 Object.freeze 影响,也不受 Object.defineProperty 影响,但保持可变。

由于使用这两种工具只能浅层地实现不变性,而深度不变性的成本很高,因此我建议将不变性视为一项策略,而不是明确强制执行它。

关于javascript - 对于不变性,使用 Object.defineProperty 和 Object.freeze 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42951392/

相关文章:

使用rust "error: moving out of immutable field"

javascript - 如何使用 PostgreSQL 对 JSON 中的日期使用比较运算符(如 BETWEEN 子句)?

javascript - 将 'when' 与延迟一起使用

javascript - 缓存视频 blob url src?

javascript - Array .prototype .filter() 在什么时候检查虚假值?

javascript - 解构嵌套对象

javascript - React 无法读取未定义的属性映射

python - 如何用迭代器修改可迭代对象的元素? IE。如何在 Python 中获取写迭代器?

c++ - 不可变接口(interface)的抽象类

javascript - 为什么 console.log() 在异步代码上有效,但 array.push() 无效?