博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JavaScript阻止修改对象的三种方式
阅读量:6443 次
发布时间:2019-06-23

本文共 2097 字,大约阅读时间需要 6 分钟。

JavaScript中,我们希望别人无法修改我们创建的对象。比如,代码库的作者很可能想锁定核心库的某些部分来保证它们不被意外地修改。ES5中引入了三种锁定修改的级别:防止扩展preventExtensions密封seal冻结frezze

这三种级别逐渐增强。对于超过级别的行为,在非严格模式下将会悄无声息地失败,在严格模式下将会抛出一个错误。因此,建议使用严格模式,更加方便调试。

正常对象:

可以添加属性和方法,所有属性和方法可以被删除、修改。

var person = {    name: "Nicholas"};

防止扩展:

禁止为对象添加属性和方法。但已存在的属性和方法可以被修改或删除。

实施操作:Object.preventExtensions()
检测是否应用该操作:Object.isExtensible()

Object.preventExtensions(person);console.log(Object.isExtensible(person));  // falseperson.age = 25;  // 防止扩展console.log(person.age);  // undefined

密封:

禁止为对象删除已存在的属性和方法。被密封的对象也是不可扩展的。

实施操作:Object.seal()
检测是否应用该操作:Object.isSealed()

Object.seal(person);console.log(Object.isExtensible(person));  // falseconsole.log(Object.isSealed(person));  // trueperson.age = 25;  // 防止扩展console.log(person.age);  // undefineddelete person.name;  // 防止删除console.log(person.name);  // Nicholas

冻结:

禁止为对象修改已存在的属性和方法。所有字段均只读。被冻结的对象也是不可扩展和密封的。

实施操作:Object.freeze()
检测是否应用该操作:Object.isFrozen()

Object.freeze(person);console.log(Object.isExtensible(person));  // falseconsole.log(Object.isSealed(person));  // trueconsole.log(Object.isFrozen(person));  // trueperson.age = 25;  // 防止扩展console.log(person.age);  // undefineddelete person.name;  // 防止删除console.log(person.name);  // Nicholasperson.name = "Greg"  // 防止修改console.log(person.name);  // Nicholas

注意:

  • 对于同一个对象,防止扩展-->密封-->冻结这种操作是不可逆的。一旦该对象被冻结,是无法恢复到防止扩展或密封状态的。一旦该对象被密封,是无法恢复到防止扩展状态的。一旦对象被锁定,它将无法解锁。
Object.freeze(person);person.name = "Greg";  // 防止修改console.log(person.name);  // NicholasObject.preventExtensions(person);  // 无法回退person.name = "Greg";  // 防止修改console.log(person.name);  // Nicholas
  • Object.seal()方法,会在一个现有对象上调用Object.preventExtensions(),并把所有属性标记为configurable: false
  • Object.freeze()方法,会在一个现有对象上调用Object.seal(),并把所有属性标记为writable: false
  • 深度冻结一个对象是指,首先在这个对象上调用Object.freeze(),然后遍历它引用的所有对象,并且在这些对象上调用Object.freeze()

总结:

添加 删除 修改 实施操作 检测是否应用
防止扩展 x v v Object.preventExtensions() Object.isExtensible()
密封 x x v Object.seal() Object.isSealed()
冻结 x x x Object.freeze() Object.isFrozen()

参考自《编写可维护的JavaScript》、《你不知道的JavaScript(上卷)》

转载于:https://www.cnblogs.com/gymmer/p/6755328.html

你可能感兴趣的文章
Linux常用软件
查看>>
Java下数字类型的转换
查看>>
DNS原理及DNS服务器的建立(主从)
查看>>
过滤某一个时间段的日志----sed
查看>>
修改mysql数据库的用户名和密码
查看>>
Javascript数据类型
查看>>
修改centos等linux系统的hostname不重启生效
查看>>
python的range和xrange的区别
查看>>
我的友情链接
查看>>
mongodb的安装及主从复制
查看>>
paramiko模块实现批量执行远程主机命令
查看>>
【v2.x OGE教程 17】事务处理
查看>>
redhat/centos网络配置
查看>>
VMware虚拟化技术培训(10) 桌面虚拟化之二
查看>>
Win7旗舰版中的IIS配置asp.net的运行环境
查看>>
Stimulsoft Reports.Net基础教程(八):创建列式报表②
查看>>
Maven
查看>>
Newbit的引脚图
查看>>
sql server使用组合索引需要注意的地方
查看>>
quartz (从原理到应用)详解篇
查看>>