当前位置:   article > 正文

JS之preventExtensions、seal和freeze

preventextensions

preventExtensions

默认情况下,所有对象都是可扩展的。在调用preventExtensions之后,将不能再往对象中添加属性(严格模式报错,非严格模式静默失败),对已有属性没有影响

  1. let obj1 = {name: 'xiaohua'};
  2. Object.preventExtensions(obj1);
  3. obj1.name = 'xiaomei';
  4. obj1.name //xiaomei 已有属性可读可写
  5. obj1.age=23
  6. obj1.age // undefined,添加属性静默失败
  7. 复制代码

seal

密封属性;密封属性不可扩展;而且已有成员的configurable属性会被设置为false

  1. let obj2 = {name: 'xiaohua'};
  2. Object.seal(obj2);
  3. Object.isExtensible(obj2) // false, 不可扩展
  4. obj1.age=23
  5. obj1.age // undefined,添加属性静默失败
  6. Object.getOwnPropertyDescriptor(obj2, 'name') // writable: true, enumerable: true, configurable: false
  7. 复制代码

freeze

冻结对象;冻结对象不可扩展且密封;而且已有成员的configurable及writable属性会被设置为false

  1. let obj3 = {name: 'xiaohua'};
  2. Object.freeze(obj3)
  3. Object.isExtensible(obj3) // false, 不可扩展
  4. Object.isSealed(obj3) // true, 密封
  5. Object.getOwnPropertyDescriptor(obj2, 'name') // writable: false, enumerable: true, configurable: false
  6. 复制代码

补充知识

两种定义对象属性的方式比较

使用obj = {age: 2}定义对象的属性,其writable,enumerable,configurable均为true

  1. let obj = {age: 2};
  2. Object.getOwnPropertyDescriptor(obj, 'age');
  3. // value: 2, writable: true, enumerable: true, configurable: true
  4. 复制代码

Object.defineProperty(obj, prop, descriptor),使用defineProperty定义对象的属性,其中未定义的属性默认为false

  1. let obj2 = {};
  2. Object.defineProperty(obj2, 'age', {value: 2});
  3. Object.getOwnPropertyDescriptor(obj2, 'age');
  4. // value: 2, writable: false, enumerable: false, configurable: false
  5. Object.defineProperty(obj2, 'favourites', {value: 'js', writable: true});
  6. Object.getOwnPropertyDescriptor(obj2, 'favourites');
  7. // value: "js", writable: true, enumerable: false, configurable: false
  8. 复制代码
writable,enumerable,configurable
对象的数据属性

writable:表示能否修改属性的值。true时,可以重写该属性的值;属性为false时,修改属性的值在非严格模式下不会生效,严格模式下会报错。

enumerable:表示能否通过for-inObject.keys()循环返回属性。true时可以访问,false不可以访问到

configurable:表示能否通过delete删除属性,能否通过Object.defineProperty()修改属性的特性。值为true时可以delete并且可以修改,值为false时,表示不能从对象中删除属性。如果对这个属性调用delete,则在非严格模式下什么也不会,但是严格模式下会导致错误。而且,此时,再调用Object.defineProperty()方法修改除writable之外的特性,都会导致错误。

  1. let person = {};
  2. Object.defineProperty(person, 'name', {value: 'xiaohua', writable: true, enumerable: true});
  3. // writable: true, enumerable: true, configurable: false
  4. Object.defineProperty(person, 'name', { enumerable: false}); // 报错
  5. Object.defineProperty(person, 'name', { writable: false}); // configurable为false, 且writable为true时,可以修改writable
  6. // writable: false, enumerable: true, configurable: false
  7. Object.defineProperty(person, 'name', { writable: true}); // 报错
  8. 复制代码

value:表示这个属性的数据值,默认为undefined

在调用Object.defineProperty()方法时,以上属性默认 false

访问器属性

访问器属性不包含数据值-它们是一对getter和setter函数。访问器属性有如下4个特性

configurable: 同上

enumerable: 同上

get:在读取属性时调用的函数

set:在写入属性时调用的函数

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/395756
推荐阅读
相关标签
  

闽ICP备14008679号