Object.isSealed()返回true的核心依据是对象不可扩展且所有自有属性的configurable均为false;configurable是密封判定的硬性门槛,缺一不可。

Object.isSealed() 判定为 true 的核心依据,是对象**不可扩展**且**所有自有属性的 configurable 均为 false**。configurable 是决定密封状态的关键开关,它不单独起作用,但缺它不可。
configurable 是密封判定的硬性门槛
Object.isSealed(obj) 返回 true,必须同时满足两个条件:
- Object.isExtensible(obj) === false(对象已不可扩展)
- 对象所有自有属性(own properties)的 configurable 描述符全为 false
只要有一个自有属性的 configurable 仍为 true,isSealed 就返回 false——哪怕其他属性都 sealed 了,哪怕 writable 或 enumerable 都被改过,都不影响这个判定逻辑。
seal 操作如何统一设置 configurable
调用 Object.seal(obj) 会自动执行两件事:
立即学习“Java免费学习笔记(深入)”;
- 让 Object.preventExtensions(obj) 生效 → 对象不可扩展
- 遍历所有自有属性,把每个属性的 configurable 设为 false
注意:它不会修改 writable 或 enumerable,也不会动原型链上的属性。所以 isSealed 只看当前对象自身、且只认 configurable 是否全部锁死。
手动修改 configurable 会导致 isSealed 失效
即使对象已被 seal 过,如果你之后用 Object.defineProperty 强行把某个属性的 configurable 改回 true(在非严格模式下可能静默失败;严格模式直接 TypeError),那么 isSealed 就立刻变 false。
反过来说,如果一个对象没被 seal,但你手动把所有自有属性的 configurable 都设为 false,并调用 Object.preventExtensions,isSealed 也会返回 true——这说明 seal 只是一种便捷封装,本质就是这两步操作。
enumerable 和 writable 不参与判定
无论某个属性的 enumerable 是 true 还是 false,writable 是 true 还是 false,只要它的 configurable 是 true,isSealed 就不可能为 true。
常见误区:以为把所有属性设成 writable: false 就“封住”了对象——其实不行。只有 configurable 锁死,才真正切断了属性结构被修改的可能性(删除、重定义、转 accessor 等)。
文章来自机圈观察员网,发布者:,转载请注明出处:https://www.jqgcy.com/xitongjiaocheng/123568.html