JS之preventExtensions、seal和freeze

preventExtensions

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

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

seal

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

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

freeze

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

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

补充知识

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

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

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

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

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

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

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

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

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

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

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

访问器属性

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

configurable: 同上

enumerable: 同上

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值