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)
5条答案
按热度按时间lmvvr0a81#
如果您希望某个对象不能被修改,可以使用
Object.freeze
。Object.freeze()
方法冻结对象:也就是说,防止向其添加新属性;防止现有属性被删除;并且防止现有属性或它们的可枚举性、可配置性或可写性被改变,它也防止原型被改变。该方法返回冻结状态的对象。如果您只是想防止变量被重新分配,您可以使用
const
(ES6),但是请注意:const声明创建了一个对值的只读引用。这并不意味着它所保存的值是不可变的,只是变量标识符不能被重新分配。
例如,下面的内容是完全有效的
但是,尝试重新分配用
const
声明的变量将抛出TypeError
:idv4meu82#
对于不可变对象,我们可以使用以下方法
Object.freeze()
1.要在更新对象时强制对象不变性,请确保
1.使用
Object.assign({},a,{foo:'bar'})
而不是a.foo='bar'
1.我们可以使用
spread(...)
运算符。参见示例:
44u64gxh3#
您可以使用Object.freeze()方法冻结对象。冻结的对象不能再更改,并防止:
演示**:**
如果你在上面的代码片段中看到,它可以很好地处理包含原始值的属性,但它正在更新嵌套的
object/array
的值。因此,如果你在你的需求中使用typescript,你可以尝试
as const
。它会冻结整个对象以及对象/数组的嵌套属性。u4dcyp6a4#
不,没有好的方法来强制
const
-ness是ES 5。nue99wik5#
如果您将代码分为纯代码和非纯代码两部分(如函数核心、命令式 shell ),那么您可以使用对象和数组来处理纯代码部分,而不必按照规则来改变它们。
我已经这样做了很多年,并且使用了a library来辅助这种开发风格。我无法想象需要使用
Object.freeze
来保证所有东西。现在,最终,当records and tuples被采用到规范中时,您可以直接使用它们来代替!