2015-07-20 87 views
9

Set是一個對象,Object.freeze()作品對對象的屬性,這顯然地圖和設置不使用:如是否可以「凍結」Set(或Map)?

 
let m = new Map(); 
Object.freeze(m); 
m.set('key', 55); 
m.get('key') ==> 55 

這是Chrome的行爲,我希望它是標準的。

據我所知,人們可以(有時)將Set或Map轉換成普通對象,然後凍結對象。但是隨後解凍和凍結版本之間的關鍵訪問更改。

+1

你使用什麼設置和地圖?我還沒有在JavaScript中看到過 – MaxZoom

+1

@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 –

+0

移動瀏覽器看起來不太好。 – MaxZoom

回答

4

有趣的問題,但目前看起來不像SetMap對象上直接支持的功能。

這裏有一些變通辦法,我能想到用Set對象爲指導:

  1. 您可以創建一個刪除.add().clear().delete()代理對象,但允許代理到其他所有訪問只讀取數據的方法。這將隱藏對實際Set對象的訪問權限,因此無法直接訪問它,並提供代理訪問所有其他方法。

  2. 您可以覆蓋.add().clear().delete()在給定Set實例與沒有采取任何行動或拋出一個異常,會阻止修改方法。如果您使這些覆蓋方法不可配置,然後在對象上執行了.freeze(),則無法恢復這些方法。人們可以直接在Set對象上使用Set.prototype.add來仍然繞過它。

+0

謝謝。同意。第一個看起來很多工作,一個失去'instanceof Set'。第二,覆蓋'.add()'等,似乎更容易,讓它失敗默默或提出錯誤。就「仍然繞過」而言,對我而言,凍結的主要優勢並非絕對安全,而是保護自己,就像輸入變量一樣。 –