Object.seal()封闭对象,禁止添加/删除属性但允许修改可写属性值;调用后对象不可扩展且自有属性configurable为false,writable不变;可用Object.isSealed()检测;与Object.freeze相比,seal不冻结属性值。

Object.seal() 会封闭一个对象,使其不能添加新属性、也不能删除已有属性,但允许修改已有属性的值(前提是该属性是可写的)。
密封对象的核心效果
调用 Object.seal(obj) 后:
- 对象变为“非扩展”(
Object.isExtensible(obj) === false),无法新增属性 - 所有现有自有属性被设为
configurable: false,因此无法删除或重新配置(如改writable、enumerable) - 属性的
writable状态不变,所以如果原属性可写,仍可赋新值
基本用法示例
直接传入目标对象即可:
```jsconst obj = { a: 1, b: 2 };
Object.seal(obj);
obj.c = 3; // 静默失败(非严格模式),或抛 TypeError(严格模式)
delete obj.a; // 同样静默失败或报错
obj.a = 99; // ✅ 允许,因为 a 原本 writable: true
console.log(obj); // { a: 99, b: 2 }
```
如何检测对象是否被密封
没有直接的 Object.isSealed() 方法,但可通过组合判断:
立即学习“Java免费学习笔记(深入)”;
- 先确认
Object.isExtensible(obj) === false - 再检查每个自有属性的
configurable是否都为false
更简单的方式是使用内置方法:Object.isSealed(obj) —— 它正是为此设计的标准 API,返回布尔值。
```jsconsole.log(Object.isSealed(obj)); // true
```
注意与 Object.freeze 的区别
两者都阻止新增和删除属性,但关键差异在属性值能否修改:
-
Object.seal():不改动
writable,可改值(除非属性原本不可写) -
Object.freeze():还会把所有属性设为
writable: false,彻底禁止修改值
也就是说,freeze 是比 seal 更强的限制。


















