object.seal密封对象结构:禁止添加/删除属性,允许修改可写属性值,且属性不可配置;可用object.issealed检测;强度介于preventextensions和freeze之间。

Object.seal 会冻结对象的「结构」:禁止添加新属性、删除已有属性,但允许修改已有属性的值(前提是该属性本身是可写的)。
密封对象的核心效果
调用 Object.seal(obj) 后:
- 不能用
obj.newProp = value或Object.defineProperty添加新属性 - 不能用
delete obj.existingProp删除已有属性 - 可以正常赋值修改已有可写属性(如
obj.name = 'Alice') - 不能通过
Object.defineProperty把已有属性改为不可配置(因为已密封)
简单示例一看就懂
? 这段代码演示了密封前后的行为差异:
const person = { name: 'Bob', age: 30 };
Object.seal(person);
person.name = 'Alice'; // ✅ 允许:修改已有可写属性
person.job = 'Engineer'; // ❌ 静默失败(非严格模式)或报错(严格模式)
delete person.age; // ❌ 同样静默失败或报错
Object.defineProperty(person, 'name', { writable: false }); // ❌ 报错:不可重新配置
怎么判断一个对象是否被密封?
用 Object.isSealed(obj):
- 返回
true表示对象已被密封(且所有自身属性都不可配置) - 注意:它不检查属性是否可写,只关心「能否增删属性」和「属性是否可配置」
- 密封对象一定是
Object.isExtensible(obj) === false
和 Object.freeze、Object.preventExtensions 的区别
三者都是限制对象变更,但强度递增:
-
preventExtensions:只禁新增,允许删、允许改值、允许改属性描述符 -
seal:禁新增 + 禁删除,允许改值,禁改属性描述符(即所有属性变不可配置) -
freeze:在seal基础上,把所有自有属性设为writable: false→ 完全不可改值











