浅谈 Object.freeze()

对象常量

结合 writable: false 和 configurable: false 可以创建一个整整的常量属性(不可修改、重定义和删除)

1
2
3
4
5
6
7
const obj = {}

Object.defineProperty(obj, 'test', {
value: 123,
writable: false,
configurable: false
})

禁止扩展 Object.preventExtensions(obj)

禁止一个对象添加新属性,并保留已有属性,可以使用 Object.preventExtensions(obj)

1
2
3
const obj = {}

Object.preventExtensions(obj)

密封 Object.seal(obj)

Object.seal(obj) 会创建一个 “密封” 对象,这个方法实际上会在一个现有对象上调用 Object.preventExtensions(obj),并把所有属性表记为 configurable: false

所以,密封之后不仅不能添加新属性,也不能重新配置或者删除任何现有属性(虽然可以修改属性的值)

冻结 Object.freeze(obj)

Object.freeze(obj) 会创建一个冻结对象,这个方法实际上会在一个现有对象上调用 Object.seal(obj),并把所有 “数据访问” 属性标记为 writable: false,这样就无法修改它们的值

这个方法是你可以应用在对象上级别最高的不可变性,它会禁止对于对象本身及其任意直接属性的修改(属性引用的其他对象不受影响)

如果想 “深度冻结” 一个对象,对该对象调用 Object.freeze(obj),在遍历所有引用的对象,并在这些对象上调用 Object.freeze(..),需要注意,这样会无意中冻结其他对象