object.seal()密封对象:禁止增删属性、锁定configurable为false,但允许修改可写属性的值;它原地修改对象,不递归作用于嵌套对象,且可用object.issealed()检测。

Object.seal() 会冻结对象的结构:禁止添加新属性、删除现有属性,同时将所有自有属性的 configurable 设为 false(即不可重新配置,比如不能删、不能改 configurable 或 writable,但若属性本身是可写的,仍可修改值)。
基本用法:直接调用即可密封
只需传入目标对象,Object.seal() 会原地修改并返回该对象:
- 它不创建新对象,而是直接修改原对象的内部属性描述符
- 返回值就是该对象本身(便于链式调用,但无实际意义)
- 对 null 或 undefined 调用会抛出 TypeError
密封后能做什么、不能做什么
假设有一个对象 let obj = { a: 1, b: 2 },执行 Object.seal(obj) 后:
- ✅ 可以修改已有属性的值(如
obj.a = 3),前提是该属性writable: true - ✅ 可以读取任何自有属性
- ❌ 不可添加新属性(
obj.c = 4在严格模式下报错,非严格模式静默失败) - ❌ 不可删除已有属性(
delete obj.a返回 false) - ❌ 不可改变属性的
configurable或writable特性(Object.defineProperty(obj, 'a', { configurable: true })报错)
验证是否已密封
没有内置的 Object.isSealed() 检查方法(注意:有 Object.isFrozen() 和 Object.isExtensible(),但 isSealed 是标准 API,存在且可用)——实际上,ES5+ 支持 Object.isSealed():
-
Object.isSealed(obj)返回布尔值,准确判断对象是否被密封 - 它检查两点:是否不可扩展(
!Object.isExtensible(obj))且所有自有属性configurable === false - 注意:只检测自有属性,继承属性不影响结果
和 Object.freeze() 的关键区别
两者都设 configurable: false 且禁止扩展,但:
-
Object.seal()不动writable—— 原来可写的属性仍可赋值 -
Object.freeze()还会把所有自有属性的writable设为false,彻底禁止修改值 - 所以
freeze是比seal更强的限制;密封是“锁定结构,保留数据可变性”











