在javascript中创建不可变对象

aelbi1ox  于 2023-01-19  发布在  Java
关注(0)|答案(5)|浏览(196)

我有一个从API接收一些数据的例程。我想将这些数据存储在一个对象中,但是在那之后我想“锁定”这个对象,并且不允许在那之后对属性或它们的值进行任何更改。这可能吗?(如果可能,只使用ES5)

lmvvr0a8

lmvvr0a81#

如果您希望某个对象不能被修改,可以使用Object.freeze
Object.freeze()方法冻结对象:也就是说,防止向其添加新属性;防止现有属性被删除;并且防止现有属性或它们的可枚举性、可配置性或可写性被改变,它也防止原型被改变。该方法返回冻结状态的对象。
如果您只是想防止变量被重新分配,您可以使用const(ES6),但是请注意:
const声明创建了一个对值的只读引用。这并不意味着它所保存的值是不可变的,只是变量标识符不能被重新分配。
例如,下面的内容是完全有效的

const a = { x: 7 }
a.x = 9
console.log(a.x) // 9

但是,尝试重新分配用const声明的变量将抛出TypeError

const a = 5
a = 7
idv4meu8

idv4meu82#

对于不可变对象,我们可以使用以下方法

  1. Object.freeze()
    1.要在更新对象时强制对象不变性,请确保
    1.使用Object.assign({},a,{foo:'bar'})而不是a.foo='bar'
    1.我们可以使用spread(...)运算符。

参见示例:

var person={name:'pavan',age:26}

var newPerson={...person,name:'raju'}

console.log(newPerson ===person) //false
console.log(person)  //{name:'pavan',age:26}
console.log(newPerson)  //{name:'raju',age:26}
44u64gxh

44u64gxh3#

您可以使用Object.freeze()方法冻结对象。冻结的对象不能再更改,并防止:

  • 新属性添加到其中
  • 现有属性被删除
  • 更改现有属性的可枚举性、可配置性或可写性
  • 现有属性的值不会被更改。

演示**:**

const obj = {
  name: 'Alpha',
  age: 30,
  hobbies: ['reading', 'writing']
};

Object.freeze(obj);

obj.name = 'Beta';
obj.hobbies[0] = 'painting'; 

console.log(obj.name); // Alpha (It works fine with the properties which contains primitive values)
console.log(obj.hobbies[0]); // painting (It does not work for nested objects/array)

如果你在上面的代码片段中看到,它可以很好地处理包含原始值的属性,但它正在更新嵌套的object/array的值。
因此,如果你在你的需求中使用typescript,你可以尝试as const。它会冻结整个对象以及对象/数组的嵌套属性。

u4dcyp6a

u4dcyp6a4#

不,没有好的方法来强制const-ness是ES 5。

nue99wik

nue99wik5#

如果您将代码分为纯代码和非纯代码两部分(如函数核心、命令式 shell ),那么您可以使用对象和数组来处理纯代码部分,而不必按照规则来改变它们。
我已经这样做了很多年,并且使用了a library来辅助这种开发风格。我无法想象需要使用Object.freeze来保证所有东西。现在,最终,当records and tuples被采用到规范中时,您可以直接使用它们来代替!

相关问题