JavaScript 有三种方式用来防止对象被篡改,分别是 Object.preventExtension()
,Object.seal()
和 Object.freeze()
,它们之间有什么不同呢?
差异对比表
新增属性 | 修改属性 | 删除属性 | |
---|---|---|---|
Object.preventExtensions() | 𐄂 | ✓ | ✓ |
Object.seal() | 𐄂 | ✓ | 𐄂 |
Object.freeze() | 𐄂 | 𐄂 | 𐄂 |
Object.preventExtension()
Object.preventExtension()
阻止在对象上新增属性,但已有属性仍然可以被删除和修改。
let obj = {
name: 'apple'
}
Object.isExtensible(obj)// true;
obj.color = 'red' // ok
Object.preventExtensions(obj);
Object.isExtensible(obj)// false
obj.shape = 'round' // 添加新属性, 不生效
obj.name = 'tomato' // 修改旧属性, ok
delete obj.color // 删除属性, ok
Object.seal()
Object.seal()
阻止在对象上新增属性或者删除旧属性,已有属性可以被修改。
let obj = {
name: 'apple'
}
Object.isSealed(obj)// false
obj.color = 'red' // ok
Object.seal(obj)
Object.isSealed(obj)// true
obj.shape = 'round' // 添加新属性, 不生效
obj.name = 'tomato' // 修改旧属性, ok
delete obj.color // 删除属性, 不生效
Object.freeze()
Object.freeze()
阻止在对象上新增属性,删除旧属性和修改已有属性。因为可以阻止对象的属性被修改,所以有种常见的用法是在 Vue2.x 项目中创建非响应式属性以提高性能。
let obj = {
name: 'apple'
}
Object.isFrozen(obj)// false
obj.color = 'red' // ok
Object.freeze(obj)
Object.isFrozen(obj)// true
obj.shape = 'round' // 添加新属性, 不生效
obj.name = 'tomato' // 修改旧属性, 不生效
delete obj.color // 删除属性, 不生效