object.seal() 仅禁止对象扩展并设所有自有属性 configurable 为 false,对已为 false 的 configurable 无影响,不修改 writable、enumerable 或 value,故 seal 前后属性状态保持一致且不可逆。

当一个属性的 configurable 已经是 false,再调用 Object.seal() 不会产生额外副作用——因为 Object.seal() 的核心操作之一就是把所有自有属性的 configurable 设为 false,而这个动作对已经是 false 的属性是幂等的(即重复执行无影响)。
configurable 为 false 时 seal 不会报错或改变其他描述符
Object.seal() 只负责两件事:禁止扩展对象、将所有自有属性的 configurable 设为 false。它不会碰 writable、enumerable 或 value。所以即使某个属性原本就是 configurable: false,seal 后它的 writable 和 enumerable 仍保持原值,也不会触发任何异常。
但不可逆的限制会叠加显现
一旦 configurable: false,以下行为在 seal 前后都失效,而 seal 会让这种限制“全覆盖”到所有属性:
- 无法用
delete删除该属性 - 无法用
Object.defineProperty把它改成访问器属性(哪怕原本是数据属性) - 无法把
configurable或enumerable从false改回true - 无法把
writable从false改成true(但true → false仍允许)
seal 对 enumerable 的“单向压制”更明显
Object.seal() 不主动改 enumerable,但它让所有属性变成 configurable: false,从而锁死 enumerable 的可修改性:
- 如果某属性原本
enumerable: true,seal 后你仍可用defineProperty把它设为false - 但如果它原本就是
enumerable: false,seal 后就彻底无法恢复为true(因为需要configurable: true)
和 freeze 的关键区别在这里放大
Object.freeze() 会在 seal 的基础上进一步把所有属性的 writable 设为 false;而 seal 不动 writable,所以:
- 即使
configurable: false,只要writable: true,属性值依然能改 - 这个“可写但不可配”的状态,正是 seal 的设计意图——结构锁定,值仍可变
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











