而Set
是一個對象,Object.freeze()
作品對對象的屬性,這顯然地圖和設置不使用:如是否可以「凍結」Set(或Map)?
let m = new Map(); Object.freeze(m); m.set('key', 55); m.get('key') ==> 55
這是Chrome的行爲,我希望它是標準的。
據我所知,人們可以(有時)將Set或Map轉換成普通對象,然後凍結對象。但是隨後解凍和凍結版本之間的關鍵訪問更改。
而Set
是一個對象,Object.freeze()
作品對對象的屬性,這顯然地圖和設置不使用:如是否可以「凍結」Set(或Map)?
let m = new Map(); Object.freeze(m); m.set('key', 55); m.get('key') ==> 55
這是Chrome的行爲,我希望它是標準的。
據我所知,人們可以(有時)將Set或Map轉換成普通對象,然後凍結對象。但是隨後解凍和凍結版本之間的關鍵訪問更改。
有趣的問題,但目前看起來不像Set
或Map
對象上直接支持的功能。
這裏有一些變通辦法,我能想到用Set
對象爲指導:
您可以創建一個刪除.add()
,.clear()
和.delete()
代理對象,但允許代理到其他所有訪問只讀取數據的方法。這將隱藏對實際Set
對象的訪問權限,因此無法直接訪問它,並提供代理訪問所有其他方法。
您可以覆蓋.add()
,.clear()
和.delete()
在給定Set
實例與沒有采取任何行動或拋出一個異常,會阻止修改方法。如果您使這些覆蓋方法不可配置,然後在對象上執行了.freeze()
,則無法恢復這些方法。人們可以直接在Set
對象上使用Set.prototype.add
來仍然繞過它。
謝謝。同意。第一個看起來很多工作,一個失去'instanceof Set'。第二,覆蓋'.add()'等,似乎更容易,讓它失敗默默或提出錯誤。就「仍然繞過」而言,對我而言,凍結的主要優勢並非絕對安全,而是保護自己,就像輸入變量一樣。 –
你使用什麼設置和地圖?我還沒有在JavaScript中看到過 – MaxZoom
@MaxZoom:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map https://developer.mozilla.org/en-US/ docs/Web/JavaScript/Reference/Global_Objects/Set –
移動瀏覽器看起來不太好。 – MaxZoom