【问题标题】:For immutability, what is the difference between using Object.defineProperty and Object.freeze?对于不变性,使用 Object.defineProperty 和 Object.freeze 有什么区别?
【发布时间】: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


【解决方案1】:

两者是完全不同的工具。 Object.freezeObject 级别上工作较浅,而Object.defineProperty 在属性级别上工作。两者都可以控制对象类型的可变性,但后者可以做得更多。 Shallowly 表示,如果一个属性包含另一个对象类型,则该对象既不受Object.freeze 也不受Object.defineProperty 影响,而是保持可变。

由于您只能通过这两种工具来实现不可变性,而且深度不可变性的成本很高,因此我建议您将不可变性视为一项政策,而不是明确强制执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多