javascript不可变性是什么?
不可变性即某个变量在进行了某个操作之后,其本身没有发生变化,比如对于字符串而言,对字符串的任何操作都会改变字符串本身的值,而是在字符串的基础上复制出来一个然后再改变,这样我们就说是不可变的。
实现对象不可变性的几种方法:
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。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!