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。

以上就是javascript不可变性是什么?的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » JavaScript 答疑