
Object.freeze 和 Object.seal 都能限制对象的修改,但限制程度不同:freeze 更严格,完全冻结;seal 只封印结构,允许改值。
Object.seal:封印属性结构,可改值
调用 Object.seal(obj) 后:
- 不能添加新属性
- 不能删除已有属性
- 不能重配置属性(即
configurable: false) - 但可以修改已有属性的值(前提是该属性是
writable: true) - 也不能把数据属性改成访问器属性,反之亦然
示例:
const obj = { a: 1 };Object.seal(obj);
obj.a = 2; // ✅ 允许
obj.b = 3; // ❌ 静默失败(非严格模式)或报错(严格模式)
delete obj.a; // ❌ 同上
Object.defineProperty(obj, 'a', { writable: false }); // ❌ 报错,不可重配置
Object.freeze:彻底冻结,不可变
Object.freeze(obj) 在 seal 的基础上进一步加强:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 所有已有属性自动设为
writable: false - 因此既不能改值,也不能删、加、重配置
- 整个对象变成“浅冻结”——只冻结第一层,嵌套对象仍可修改
示例:
const obj = { a: 1, nested: { x: 10 } };Object.freeze(obj);
obj.a = 99; // ❌ 失败
obj.nested.x = 999; // ✅ 仍可改!因为 nested 本身没被 freeze
obj.newProp = 'hi'; // ❌ 失败
如何检测对象是否被 seal 或 freeze?
没有直接 API 判断,但可通过组合特性推断:
- 用
Object.isSealed(obj)检查是否 seal(返回布尔值) - 用
Object.isFrozen(obj)检查是否 freeze(返回布尔值) - 注意:
isFrozen为true时,isSealed也必为true
注意事项与常见误区
- 两者都只影响对象自身,不影响原型链上的属性
- 都是浅操作,嵌套对象需手动递归 freeze(如用自定义 deepFreeze 函数)
- 在严格模式下,违反限制会抛
TypeError;非严格模式下多数操作静默失败 - 冻结/封印后,
Object.keys、for...in等仍可正常遍历,只是无法修改

















