Object.isSealed()返回布尔值表示对象是否被封闭,即不可扩展且所有自有属性的configurable为false,但属性值仍可修改。

Object.isSealed() 用于判断一个对象是否被“封闭”——即不能添加新属性,已有属性的可配置性(configurable)为 false,但属性值仍可能被修改(除非该属性本身是只读的)。
什么是封闭对象(sealed object)?
封闭对象 ≠ 冻结对象(frozen),也 ≠ 不可扩展对象(non-extensible):
- 不可扩展:不能再添加新属性(
Object.isExtensible(obj) === false) - 封闭:在不可扩展基础上,所有自有属性的
configurable都为false - 冻结:在封闭基础上,所有数据属性的
writable也为false(即值不可改)
也就是说,封闭对象允许改属性值(只要属性本身可写),但不允许删属性、重定义属性描述符或添加新属性。
如何使用 Object.isSealed()
直接传入目标对象,返回布尔值:
const obj = { a: 1 };
console.log(Object.isSealed(obj)); // false
Object.seal(obj); // 封闭它
console.log(Object.isSealed(obj)); // true
注意:Object.seal() 只影响对象自身的自有属性,不递归处理嵌套对象。例如:
const obj = { a: 1, nested: { x: 2 } };
Object.seal(obj);
console.log(Object.isSealed(obj)); // true
console.log(Object.isSealed(obj.nested)); // false —— nested 本身未被 seal
常见误判场景
以下情况会导致 Object.isSealed() 返回 false,即使你认为“它应该被封了”:
- 对象有可配置(
configurable: true)的自有属性 - 对象可扩展(还能加属性),哪怕当前没加
- 原型链上的属性不影响结果——只检查对象自身的属性描述符
- 访问器属性(getter/setter)若
configurable为true,也会让isSealed返回false
验证方式:用 Object.getOwnPropertyDescriptors(obj) 查看每个自有属性的 configurable 值是否全为 false,同时确认 Object.isExtensible(obj) === false。
和 Object.isFrozen 的区别
封闭对象允许改值,冻结对象不允许:
const obj = { a: 1 };
Object.seal(obj);
obj.a = 99; // ✅ 允许(a 是 writable)
console.log(obj.a); // 99
Object.freeze(obj);
obj.a = 88; // ❌ 严格模式下报错,非严格模式静默失败
所以 Object.isFrozen(obj) 为 true 时,Object.isSealed(obj) 一定也为 true;但反过来不成立。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











