skip to content

JavaScript
Object.seal VS Object.freeze

JavaScript 中,Object.sealObject.freeze 是两种用于保护对象的方法,它们分别提供不同级别的保护。让我们通过实例来说明它们之间的差异。

Object.seal

const user = {
  name: 'John Doe',
  age: 30
}

Object.seal(user)

// 密封对象的属性可修改,但不能添加或删除
user.age = 32 // 可以修改属性值
user.gender = 'male' // 无法添加新属性
delete user.name // 无法删除现有属性

console.log(user) // 输出:{ name: 'John Doe', age: 32 }

Object.freeze

const person = {
  name: 'Alice',
  age: 25
}

Object.freeze(person)

// 冻结对象的属性不可修改、添加或删除
person.age = 30 // 无法修改属性值
person.gender = 'female' // 无法添加新属性
delete person.name // 无法删除现有属性

console.log(person) // 输出:{ name: 'Alice', age: 25 }

对属性描述符的影响

const x = { a: 1 }
Object.seal(x)

const descriptorX = Object.getOwnPropertyDescriptor(x, 'a')
console.log(descriptorX)
// 输出:{ value: 1, writable: true, enumerable: true, configurable: false }

const y = { a: 1 }
Object.freeze(y)

const descriptorY = Object.getOwnPropertyDescriptor(y, 'a')
console.log(descriptorY)
// 输出:{ value: 1, writable: false, enumerable: true, configurable: false }

可以看出两者对属性描述符的影响差异在于 writable

总结

可以看到,Object.seal 生成的密封对象允许修改现有属性值,但不能添加新属性或删除现有属性。而 Object.freeze 生成的冻结对象不仅不能修改属性值,还不能添加新属性或删除现有属性。

根据实际需求,我们可以根据对象的保护程度选择使用适合的方法。若想允许修改属性值但不希望对象结构发生变化,可以使用 Object.seal。而若希望对象完全不可修改,包括属性值和结构,可以使用 Object.freeze

无论选择哪种方法,这些对象保护方法都能在开发中帮助我们确保对象的安全性和稳定性,减少出错的可能性。

注意:Object.sealObject.freeze 只是针对对象的浅层保护,对象中嵌套的子对象仍然可以被修改。对于深层次的保护,需要使用更复杂的方法,例如递归地对对象进行 Object.sealObject.freeze 处理。