Object.freeze()方法可以凍結一個對象
一個被凍結的對象再也不能被修改
- 不能添加新屬性
- 不能刪除已有屬性
- 不能修改已有屬性的可枚舉性、可配置性、可寫性
- 不能修改已有屬性的值
- 不能修改原型
Object.freeze()的意義在哪里?
應該就是跟const常量一樣,只不過,const聲明簡單類型的值不能修改,對象卻是可以修改的,所以,如果你想禁止一個對象的修改就可以用Object.freeze()
const obj = {
one: 1 } obj.one = 2; console.log(obj.one); const obj2 = Object.freeze({ one: 1 }) obj2.one = 2; // 無法修改,報錯
還有一種情況,就是如果這個one是一個對象呢,one依舊可以被修改。
這叫淺凍結
再看一個例子:
const obj1 = { internal: {} } Object.freeze(obj1); obj1.internal.a = 'aValue' console.log(obj1.internal.a); // aValue
對於一個常量對象,整個引用圖(直接和間接引用其他對象)只能引用不可變的凍結對象。
凍結的對象被認為是不可變的,因為整個對象中的整個對象狀態(對其他對象的值和引用)是固定的。
注意,字符串、數字和布爾總是不可變的,而函數和數組是對象。
要使對象不可變,需要遞歸凍結每個類型為對象的屬性(深凍結)。
function deepFreeze(obj) { // 獲取定義在obj上的屬性名 var propNames = Object.getOwnPropertyNames(obj); // 在凍結自身之前凍結屬性 propNames.forEach(function(name) { var prop = obj[name]; // 如果prop是個對象,凍結它 if (typeof prop == 'object' && prop !== null) deepFreeze(prop); }); return Object.freeze(obj); }