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之后不允许添加新属性, 不允许删除原有属性, 不允许修改值以及属性描述符;
  • 由此可见, 锁定深度是一层一层递进的;
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 首先一个是对JS中Object的理解:JavaScript中函数是一等公民,写在代码中的 Array/Object...
    皮皮坤666阅读 1,725评论 0 3
  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,692评论 0 5
  • 概述 JavaScript 提供了一个内部数据结构,用来描述对象的属性,控制它的行为,比如该属性是否可写、可遍历等...
    oWSQo阅读 490评论 0 1
  • 概述 JavaScript提供了一个内部数据结构,用来描述一个对象的属性的行为,控制它的行为。这被称为“属性描述对...
    许先生__阅读 522评论 0 1
  • 概述 JavaScript提供了一个内部数据结构,用来描述一个对象的属性的行为,控制它的行为。这被称为“属性描述对...
    zjh111阅读 739评论 0 0