Object.freeze()凍結一個對象有什么意義?


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);
}

 

 

參考:https://www.mulingyuer.com/archives/362/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM