Object.seal() vs Object.freeze() vs Object.preventExtension()

422 阅读1分钟

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    // 删除属性, 不生效