Object.freeze()

Object.freeze()

作用

可以冻结一个对象。一个被冻结的对象再也不能被修改;冻结了一个对象则不能向这个对象添加新的属性,不能删除已有属性,不能修改该对象已有属性的可枚举性、可配置性、可写性,以及不能修改已有属性的值。此外,冻结一个对象后该对象的原型也不能被修改。

行为

Object.freeze()浅冻结,浅不可变。

var ob1 = {
   foo : 1,
    bar : {
        value : 2   
    }
};
Object.freeze( ob1 );

const ob2 = {
   foo : 1,
    bar : {
        value : 2   
    }
}

ob1.foo = 4;  // (frozen) ob1.foo not modified
ob2.foo = 4;  // (const) ob2.foo modified

ob1.bar.value = 4;  // (frozen) modified, because ob1.bar is nested
ob2.bar.value = 4;  // (const) modified

ob1.bar = 4;  // (frozen) not modified, bar is a key of obj1
ob2.bar = 4;  // (const) modified

ob1 = {};  // (frozen) ob1 redeclared
ob2 = {}; // (const) ob2 not redeclared

内部原理

  • Object.definedProperty() 方法可以定义对象的属性的特性。如可不可以删除、可不可以修改等
  • Object.seal() 方法可以让对象不能被扩展、删除属性等
function myFreeze(obj) {
  if (obj instanceof Object) {
    Object.seal(obj);

    let p;
    for (p in obj) {
      if (obj.hasOwnProperty(p)) {
        Object.defineProperty(obj, p, {
          writable: false
        });
        
        // myFreeze(obj[p]);// 递归,实现更深层次的冻结
      }
    }

  }
}

参考