object.seal()禁止新增和删除属性、锁定所有现有属性的configurable为false,但允许修改可写属性的值;它仅浅层密封,不作用于原型链或嵌套对象。

Object.seal 会阻止向对象添加新属性,同时将所有现有属性设为不可配置(即不能删除、不能改描述符),但**仍允许修改已有属性的值**。
seal 的核心效果
调用 Object.seal(obj) 后:
- 无法新增属性(
obj.newProp = 1失败,严格模式报错,非严格模式静默忽略) - 无法删除已有属性(
delete obj.existing返回false) - 无法修改属性的描述符(如
writable、configurable、enumerable) - 可以正常读写已有属性的值(只要它原本是
writable: true)
和 Object.freeze 的区别
Object.freeze 更严格:除了 seal 的限制外,还会把所有已有属性的 writable 设为 false,禁止改值;而 seal 不影响 writable。
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
例如:
const obj = { a: 1 };
Object.seal(obj);
obj.a = 2; // ✅ 允许(a 原本可写)
obj.b = 3; // ❌ 新增失败
delete obj.a; // ❌ 删除失败
Object.defineProperty(obj, 'a', { writable: false }); // ❌ 描述符不可改
如何检查对象是否被 seal
没有直接 API 判断,但可通过组合行为推断:
- 尝试新增一个临时属性,再用
in或hasOwnProperty检查是否生效 - 用
Object.getOwnPropertyDescriptor(obj, key)查任意属性的configurable是否为false(seal 后必为false,但反过来不绝对) - 实际开发中更推荐用
Object.isSealed(obj)—— 它是标准方法,返回布尔值
Object.isSealed({}); // false
Object.isSealed(Object.seal({})); // true
注意边界情况
seal 只作用于对象**自身**,不递归处理嵌套对象:
-
Object.seal({ nested: {} })→nested属性本身不可删/不可重定义,但nested对象内部仍可自由增删改 - 如需深层冻结,需手动递归调用
Object.seal或使用Object.freeze - 数组也是对象,
Object.seal([1,2])会禁止push、pop等改变长度的操作(因为它们本质是修改length或新增索引属性)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










