簡體   English   中英

在 javascript 中創建一個不可變對象作為類

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM