object.seal()密封对象,禁止新增和删除属性、锁定所有现有属性configurable为false,但允许修改可写属性的值;它仅浅层作用,不影响原型链或嵌套对象。

Object.seal 能冻结对象的结构:禁止新增和删除属性,同时将所有现有属性设为不可配置(但允许修改值),适合需要稳定“形状”又保留部分灵活性的场景。
封印后能做什么、不能做什么
封印后的对象仍可:
- 修改已有属性的值(只要该属性本身是可写的)
- 读取任意已有属性
- 遍历属性(
for...in、Object.keys等照常工作)
但不能再:
- 添加新属性(如
obj.newProp = 1会静默失败,严格模式下抛错) - 删除已有属性(
delete obj.existingProp返回false) - 改变属性的描述符(如把
writable设为false,或把configurable改为true)
和 Object.freeze 的关键区别
Object.seal 不限制属性值的变更,而 Object.freeze 还会把所有属性设为 writable: false。这意味着:
- 若你希望对象字段可更新(比如状态对象的
count或status),但不允许被意外删改结构,用seal - 若连赋值都不允许(比如配置常量对象),应选
freeze - 两者都使
isSealed和isFrozen分别返回true;注意isFrozen(obj) === true必然推出isSealed(obj) === true,但反过来不成立
实际使用建议
封印宜在对象初始化完成、进入稳定阶段时调用,避免中途漏掉属性:
- 不要先 seal 再加属性——新加属性会被忽略,且无法补救
- 可在构造函数末尾或工厂函数 return 前调用,例如:
return Object.seal({ id, name, createdAt }); - 配合
Object.defineProperty预设属性特性再 seal,能更精细控制(比如让某个字段只读但允许删除?不行——seal 后configurable固定为false,所以删除本身已被禁) - 检查是否已封印可用
Object.isSealed(obj),但注意它不递归检测嵌套对象
注意嵌套对象不受保护
Object.seal 是浅层操作:它只作用于目标对象自身属性,对嵌套的对象、数组等内部结构完全无影响。
- 例如:
const obj = Object.seal({ user: { name: 'Alice' } });→obj.user.name = 'Bob'依然成功 - 若需深层防护,需手动递归 seal(或 freeze),或借助第三方库如
immer/deep-freeze,但要注意性能与可维护性权衡
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











