[英]Creating an immutable object as a class in javascript
我想創建一個具有各種方法的對象,但核心數據永遠無法更改。 如果使用基於類的方法,那么使用私有變量是唯一的方法嗎? 例如:
class Data { #name; #elements; constructor(name, elements = new Set) { this.#name = name; this.#elements = elements; } get name() { return this.#name }; get elements() { return this.#elements }; get size() { return this.#elements.size }; } export { Data }; // note: why doesn't export work in StackOverflow's javascript runner?
以上有哪些可以改進的地方?
如果您希望整個對象是不可變的,您可以在構造函數中調用Object.freeze
。
class Data { constructor(name, elements = new Set) { this.name = name; this.elements = elements; Object.freeze(this); } get size() { return this.elements.size }; } var obj = new Data('A'); obj.name = 'B'; // Has no effect since the object is frozen. console.log(obj.name); // Prints 'A' obj.elements.add(42); // This works since the object is frozen only shallowly. console.log(obj.size); // Prints 1
當然,如果您只希望某些屬性是不可變的,而其他屬性不可變,這將不起作用。 另請注意, Object.freeze
創建了一個淺凍結。 因此,可以在上面的示例中將新元素添加到obj.elements
中。 如果您不希望這種行為,您需要在所有屬性上遞歸調用Object.freeze
(請參閱deepFreeze
)。
如果另一個類從您的Data
類繼承,則對Object.freeze
的調用可能會帶來問題。 請參閱此問題以獲取此方案中的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.