2017-03-22 14 views
1

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()を使用して逃したかもしれない副作用はありますか?

+0

よく分かっていることは、Object.defineProperty()を使用すると、Object.freeze()のようにすべてを不変にするのではなく、不変にするプロパティを選択できるということです。また、 'Object.defineProperty()'は便利かもしれない他の*を行うことができます。 (ちなみに、そのオブジェクトのプロパティが他のオブジェクトを参照している場合でもオブジェクトをフリーズした後でも、それらのオブジェクトはフリーズしない限り変更できます) – nnnnnn

答えて

1

どちらも全く異なるツールです。 Object.freezeObjectレベルで浅く機能しますが、Object.definePropertyはプロパティレベルで機能します。どちらもオブジェクト型の変更可能性を制御できますが、後者はオブジェクト型の変更可能性を制御できます。つまり、プロパティに別のオブジェクトタイプが含まれている場合、このオブジェクトはObject.freezeObject.definePropertyの影響を受けませんが、変更可能なままです。

両方のツールで不変性を浅くしかできず深い不変性が高価なので、明示的に強制するのではなくポリシーとして不変性を考慮することをお勧めします。

関連する問題