JavaScript对象——不变性
来源:互联网 发布:父亲与女儿的界限知乎 编辑:程序博客网 时间:2024/05/22 06:30
当我们希望属性或者对象是不可改变的,可以通过多种方法实现,但是,创建的不变都是浅不变性,只会影响目标对象和它的直接属性。
对象常量
通过writable: false和configurable: false就可以创建一个真正的常量属性(不可修改、重定义、删除):
var obj = {};Object.defineProperty(obj,"a",{ value: 2, writable: false, configurable: false});obj.a; //2obj.a = 3;obj.a; //2(无法修改)Object.defineProperty(obj,"a",{ value: 3, writable: false, configurable: false}); //Uncaught TypeError: Cannot redefine property: a(无法重定义)delete obj.a;obj.a; //2(无法删除)
禁止扩展
如果想禁止一个对象添加新属性,保留已有属性,可以使用Object.preventExtensions()
var obj = {a:2};Object.preventExtensions(obj);Object.getOwnPropertyDescriptor(obj,"a");//{//value: 2, //writable: true, //enumerable: true, //configurable: true//}obj.b = 3;obj.b; //undefined(无法添加新属性)
在非严格模式下,创建属性b会静默失败;在严格模式下,将会抛出TypeError错误。
密封
Object .seal()会创建一个密封的对象,这个方法实际上会在一个现有对象上调用Object.preventExtensions()并把所有现有属性标记configurable: false。
var obj = {a:2};Object.seal(obj);Object.getOwnPropertyDescriptor(obj,"a");//{//value: 2, //writable: true, //enumerable: true, //configurable: false//}obj.b = 3;obj.b; //undefined(不能添加新属性)Object.defineProperty(obj,"a",{ value: 3, configurable: true}); //Uncaught TypeError: Cannot redefine property: a(无法配置)delete obj.a;obj.a; //2(无法删除现有属性)obj.a = 3;obj.a; //3(注意!可以修改属性的值)
冻结
Object.freeze()会创建一个冻结对象,这个方法会在一个现有对象上调用Object.seal()并把所有“数据访问”属性标记为writable: false。
var obj = {a:2};Object.freeze(obj);Object.getOwnPropertyDescriptor(obj,"a");//{//value: 2, //writable: false, //enumerable: true, //configurable: false//}obj.a = 3;obj.a; //2(无法修改属性的值)
这个方法是可以应用在对象上的级别最高的不可变性,禁止对于对象本身及其任意直接属性的修改。
可以深度冻结一个对象:首先在这个对象上调用Object.freeze(),然后遍历它引用的所有对象并在这些对象上调用Object.freeze()。但是,这样做可能会在无意中冻结其他(共享)对象。
最后
- 利用Object.defineProperty()方法定义的属性的属性标识符
//直接定义的属性var obj = {a:1};Object.getOwnPropertyDescriptor(obj,"a");//{//value: 1, //writable: true, //enumerable: true, //configurable: true//}//利用Object.defineProperty()方法定义的属性var obj = {};Object.defineProperty(obj,"a",{ value: 2});Object.getOwnPropertyDescriptor(obj,"a");//{//value: 1, //writable: false, //enumerable: false, //configurable: false//}
- 禁止扩展:Object.preventExtensions()。(writable: true, enumerable: true, configurable: true)
- 密封:Object.seal()。(writable: true, enumerable: true, configurable: false)
- 冻结:Object.freeze()。(writable: false, enumerable: true, configurable: false)
阅读全文
0 0
- JavaScript对象——不变性
- JavaScript 字符串不变性
- 【Java学习笔记】String对象的不变性和intern()方法——基于Java SE8
- 字符串对象的不变性
- 图像不变性特征——hu矩
- Java基础——String(图解String的不变性)
- Java并发编程实践笔记之—不变性(Immutability)
- JavaScript——对象
- JavaScript基础—对象
- JavaScript—内置对象
- JavaScript—内置对象
- JavaScript02—JavaScript对象
- Java语言基础——第六回 字符串API、字符串的不变性与常量池
- IMOOC java入门第三季——Java 中字符串的不变性
- 黑马程序员【阅读源码理解String对象的不变性】
- Javascript基础——详解Javascript对象
- javascript浏览器对象——window对象
- javascript浏览器对象——计时器对象
- 兔子问题,斐波纳契数列
- RecyclerView.ItemDecoration
- HTML学习
- superMap iServer发布服务常见错误之isSucceed : false error : code: 400
- 1701H217.10.17 王建瑜 连续第七天
- JavaScript对象——不变性
- day02 pycharm的设置
- 数字摄像机常见术语和参数介绍
- Unity3D 小技巧
- 关于Android应用多套主题切换
- 微软HololensMR的介绍(一)_头显设备的硬件简介
- 静态路由配置
- linux之系统日志的查看和修改
- springboot系列(第三讲)