MDNドキュメントそうのように、初期化後クラスに変更を防止することによって、不変クラスを作成するためのソリューションとしてObject.freeze()
:不変の場合、Object.definePropertyと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.freeze()
を超えてObject.defineProperty()
を使用して逃したかもしれない副作用はありますか?
よく分かっていることは、Object.defineProperty()を使用すると、Object.freeze()のようにすべてを不変にするのではなく、不変にするプロパティを選択できるということです。また、 'Object.defineProperty()'は便利かもしれない他の*を行うことができます。 (ちなみに、そのオブジェクトのプロパティが他のオブジェクトを参照している場合でもオブジェクトをフリーズした後でも、それらのオブジェクトはフリーズしない限り変更できます) – nnnnnn