Object.seal 会封闭对象,禁止添加和删除属性、禁止修改属性描述符,但允许修改可写属性的值;它使对象不可扩展且所有自有属性 configurable 为 false,而 writable 属性保持可变。

Object.seal 会封闭一个对象,使其不能添加新属性、不能删除已有属性,但允许修改已有属性的值(前提是该属性是可写的)。
seal 的核心效果
调用 Object.seal(obj) 后:
- 对象变为“不可扩展”(
Object.isExtensible(obj) === false),不能再添加属性 - 所有已有属性的
configurable变为false,因此无法删除属性,也无法重新配置(如改 writable、enumerable) - 属性的
writable不受影响——如果原本可写,仍可赋新值;如果原本只读(writable: false),依然不能改
基本用法示例
看一个直观例子:
const obj = { a: 1, b: 2 };
Object.seal(obj);
obj.c = 3; // 静默失败(非严格模式),或抛 TypeError(严格模式)
delete obj.a; // 同样静默失败或报错
obj.a = 99; // ✅ 成功,a 原本 writable: true
Object.defineProperty(obj, 'b', { writable: false }); // ❌ 报错:cannot redefine property 'b'
如何检测对象是否被 seal
没有直接的 Object.isSealed() 判断函数,但可以组合判断:
立即学习“Java免费学习笔记(深入)”;
- 先确认
Object.isExtensible(obj) === false - 再检查每个自有属性的
configurable是否都为false
标准做法就是用内置方法:Object.isSealed(obj) —— 它正是这样实现的,可放心使用:
Object.isSealed({}); // false
Object.isSealed(Object.seal({})); // true
seal 和 freeze、preventExtensions 的区别
三者都是限制对象变更,但强度不同:
- preventExtensions:只禁新增,允许删、允许改、允许重配置
- seal:禁新增 + 禁删除 + 禁重配置(configurable: false),但允许改值(writable 不变)
-
freeze:在 seal 基础上,把所有属性的
writable也设为false,彻底禁止任何修改


















