用Object.freeze()使JavaScript对象不可变
原文:Make JavaScript Objects Immutable with Object.freeze()
const
关键字并不能防止对象属性的修改,而Object.freeze()函数可以实现,但会带有警告。
JavaScript中的对象不可变有一些混乱之处。ES6的const
关键字可以防止覆盖对象变量,但它不能防止对象属性的修改。
1 | const obj = { answer: 42 }; |
冻结对象
Object.freeze()可以“冻结”一个对象。JavaScript阻止向冻结对象进行添加、移除和修改属性。
1 | const obj = Object.freeze({ answer: 42 }); |
然而,Object.freeze()
不是递归的,仍然可以修改嵌套对象的属性。
1 | const obj = Object.freeze({ nested: { answer: 42 } }); |
有很多库可以递归的冻结对象,例如deep-freeze。
严格模式
用Object.freeze()
时一定要注意:在非严格模式,修改Object.freeze()
冻结的对象不会抛出错误。即使在严格模式函数中冻结的对象,在非严格模式修改对象属性也不会抛出错误。
1 | function strict() { |