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

时间:2017-03-22 12:16:08

标签: 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()

是否有任何副作用

1 个答案:

答案 0 :(得分:1)

两者都是完全不同的工具。 Object.freezeObject级别上工作浅,而Object.defineProperty在属性级别工作。两者都可以控制对象类型的可变性,但后者可以做更多。 Shallow意味着,如果属性包含另一个对象类型,则此对象既不受Object.freeze也不受Object.defineProperty的影响,但仍然是可变的。

由于您只能使用这两种工具实现不变性,并且深层不变性很昂贵,我建议将不可变性视为一种策略,而不是明确地执行它。