控制对象修改
控制一个对象或对象属性改变方式有下面几种。
Object.freeze()
一个被冻结的对象再也不能被修改、增删。非严格模式下修改、增删是无效的,严格模式会抛出异常(例如 Cannot assign to read only property 'x' of object)。
缺点:冻结只能做到浅冻结,如果被冻结对象的属性是对象的话,要做到完全冻结,需要递归冻结每个类型是对象的属性。
代码实现
const obj = { x: 1 }
Object.freeze(obj)
// 修改 obj.x = 2 // 删除 delete obj.x // 增加 obj.y = 1
Object.defineProperty
设置了 writable: false 的属性,是不能被修改,设置了 configurable: false,不能被删除。非严格模式下修改、增删是无效的,严格模式会抛出异常(例如 Cannot assign to read only property 'x' of object)。
缺点:defineProperty 也只能做到浅设置,如果被设置的属性是对象的话,要做到完全限制,需要递归设置每个类型是对象的属性。
代码实现
const obj = { x: 1 }
Object.defineProperty(obj, 'x', { writable: false, configurable: false })
setter 模拟
把对应属性改造成一个 setter,setter 函数体里直接抛出异常
代码实现
const obj = { x: 1 }
Object.defineProperty(obj, 'x', {
set() {
throw new Error('Cannot assign to property "x" of object')
}
})
缺点:setter 可以通过 delete 删除