object.seal用于密封对象,禁止添加或删除属性,并将所有现有属性设为不可配置,但仍允许修改可写属性的值;它仅浅层作用,不递归影响嵌套对象。

Object.seal 会封闭一个对象,使其不能添加新属性、不能删除已有属性,同时将所有现有属性设为不可配置(configurable: false),但**仍允许修改属性值**(前提是属性本身是可写的)。
封闭对象的基本用法
调用 Object.seal(obj) 后,对象进入“密封”状态:
- 无法通过赋值或
Object.defineProperty添加新属性 - 无法用
delete删除已有属性 - 无法用
Object.defineProperty改变任何属性的configurable或enumerable特性(会静默失败或抛错,取决于严格模式) - 已有属性的
writable不受影响——如果原本可写,仍能改值;如果只读,依然不能改
实际效果演示
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
const obj = { a: 1, b: 2 };
Object.seal(obj);
obj.c = 3; // ❌ 静默失败(非严格模式)/ 抛 TypeError(严格模式)
delete obj.a; // ❌ 同上
Object.defineProperty(obj, 'a', { configurable: true }); // ❌ 失败
obj.a = 99; // ✅ 成功,a 仍是可写的
Object.defineProperty(obj, 'a', { writable: false }); // ✅ 可设为只读(因 configurable 未被锁死前 writable 可改)
如何检测对象是否被封闭
没有直接的 Object.isSealed() 方法?其实有——它就是 Object.isSealed:
-
Object.isSealed(obj)返回布尔值 - 它检查:所有属性
configurable: false,且对象自身不可扩展(Object.isExtensible(obj) === false) - 注意:它不检查属性是否可写,也不保证值不变
和 Object.freeze、Object.preventExtensions 的区别
三者递进增强保护级别:
-
preventExtensions:只禁新增,可删、可改配置、可改值 -
seal:禁新增 + 禁删除 + 禁改配置,但**不限制改值** -
freeze:在seal基础上,把所有数据属性设为writable: false(即完全不可变)
简单记:seal 是“封口不锁芯”,freeze 才是“连芯一起锁死”。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










