实现对象不可变性的几种方法:
1. 对象常量
要使对象的某个属性为常量(即不可修改,不可删除,不可重新定义)
可以按照上面讲的使用Object.defineProperty方法,将属性的属性描述符writable,configurable都设为false
2.禁止对象扩展
使用Object.preventExtensions()方法让一个对象变的不可扩展,也就是永远不能再添加新的属性。
注意:不可扩展的对象,属性可能还能够被删除。
注意:Object.preventExtensions()仅阻止添加自身的属性。但属性仍然可以添加到对象原型。
举个例子:
let person = { name: 'noshower' } //使得person不可扩展 Object.preventExtensions(person); person.age = 22; console.log(person.age); // undefined age属性没有被添加进来 delete person.name; console.log(person.name); //undefined name属性被删除了
3. 密封对象
使用Object.seal()方法密封一个对象,这个方法实际上会在一个现有对象上调用Object.preventExtensions并把所有自身现有属性标记为configurable:false
密封之后,这个对象不能添加属性,不能重新配置或者删除任何现有属性。
不会影响从原型链上继承的属性。但__proto__ 属性的值也会不能修改。
举个例子:
let person = { name: 'noshower' } //密封person Object.seal(person); //添加age属性 person.age = 23; //输出name属性的属性描述符 console.log(Object.getOwnPropertyDescriptor(person, 'name')); // { value: 'noshower',writable: true, enumerable: true,configurable:false } console.log(person.age); // undefined 表明不可添加新属性 delete person.name; console.log(person.name); // noshower 表明不可删除属性
4. 冻结对象
Object.freeze()方法可以冻结一个对象。这个方法实际上会在一个现有对象上调用Object.seal()并把所有数据访问属性标记为writable:false,这样就无法修改它们了。
举个例子:
let person = { name: 'noshower' } //冻结person对象 Object.freeze(person); console.log(Object.getOwnPropertyDescriptor(person, 'name')); // { value: 'noshower',writable: false, enumerable: true,configurable:false } person.name = 'Jack'; console.log(person.name); // noshower 表明属性不可修改
控制一个对象的不可变性,有四个方法:Object.defineProperty(或者Object.defineProperties),Object.preventExtensions,Object.seal,Object.freeze。
以上就是javascript不可变性是什么?的详细内容,更多请关注0133技术站其它相关文章!