Object.preventExtensions()、Object.seal()、Object.freeze() 的区别

Object.preventExtensions()

让一个对象变的不可扩展,也就是永远不能再添加新的属性。返回和传入的参数相同的对象。

  var obj = {};
  obj.a = 1;
  Object.defineProperty(obj, 'c', {value: 3, configurable: true})
  Object.defineProperty(obj, 'd', {value: 4, configurable: true, writable: true})
  var obj2 = Object.preventExtensions(obj);
  obj === obj2;  // true
  obj.a = 'a';
  obj.b = 2;
  obj.c = 'c';
  obj.d = 'd'
  console.log(obj.a, obj.b, obj.c, obj.d); // a, undefined, 3, d

  delete obj.a
  console.log(obj.a, obj.b, obj.c, obj.d); // undefined, undefined, 3, d

  Object.defineProperty(obj, 'c', {writable: true});
  obj.c = 'c';
  Object.defineProperty(obj, 'd', {writable: false});
  obj.d = 4;
  console.log(obj.a, obj.b, obj.c, obj.d); // undefined, undefined, c, d

Object.seal()

封闭一个对象,阻止添加新属性并将所有现有属性标记为不可配置当前属性的值只要原来可写的就可以改变。返回和传入的参数相同的对象。

  var obj = {};
  obj.a = 1;
  Object.defineProperty(obj, 'c', {value: 3, configurable: true})
  Object.defineProperty(obj, 'd', {value: 4, configurable: true, writable: true})
  var obj2 = Object.seal(obj);
  obj === obj2;  // true
  obj.a = 'a';
  obj.b = 2;
  obj.c = 'c';
  obj.d = 'd'
  console.log(obj.a, obj.b, obj.c, obj.d); // a, undefined, 3, d

  delete obj.a
  console.log(obj.a, obj.b, obj.c, obj.d); // a, undefined, 3, d

  Object.defineProperty(obj, 'c', {writable: true}); // TypeError
  Object.defineProperty(obj, 'd', {writable: false}); // TypeError

Object.freeze()

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

  var obj = {};
  obj.a = 1;
  Object.defineProperty(obj, 'c', {value: 3, configurable: true})
  Object.defineProperty(obj, 'd', {value: 4, configurable: true, writable: true})
  var obj2 = Object.freeze(obj);
  obj === obj2;  // true
  obj.a = 'a';
  obj.b = 2;
  obj.c = 'c';
  obj.d = 'd'
  console.log(obj.a, obj.b, obj.c, obj.d); // a, undefined, 3, 4
  delete obj.a
  console.log(obj.a, obj.b, obj.c, obj.d); // a, undefined, 3, 4


  Object.defineProperty(obj, 'c', {writable: true}); // TypeError
  Object.defineProperty(obj, 'd', {writable: false}); // TypeError

总结

  • preventExtensions之后只是不允许添加新属性, 原有属性可修改可删除;
  • seal之后不允许添加新属性, 不允许删除原有属性, 是否可修改由原属性的配置决定;
  • freeze之后不允许添加新属性, 不允许删除原有属性, 不允许修改值以及属性描述符;
  • 由此可见, 锁定深度是一层一层递进的;

你可能感兴趣的:(Object.preventExtensions()、Object.seal()、Object.freeze() 的区别)