Object.seal禁止增删属性但可修改值,Object.freeze则完全锁定对象;两者均为浅冻结,嵌套对象需递归处理。

Object.freeze 和 Object.seal 都用于限制对象的修改,但它们的作用程度不同。理解两者的区别有助于在需要控制对象可变性时做出合适选择。
Object.seal:禁止添加或删除属性
调用 Object.seal(obj) 后,对象的属性无法被添加或删除,但已有属性的值仍可修改。属性的描述符(如 writable、configurable)也会受到限制。
- 不能添加新属性
- 不能删除已有属性
- 可以修改已有属性的值(前提是 writable: true)
- 不能将属性从 configurable 变为不可配置(configurable 会被设为 false)
const obj = { name: "Alice" };
Object.seal(obj);
obj.name = "Bob"; // ✅ 允许
obj.age = 25; // ❌ 无效(非严格模式下静默失败)
delete obj.name; // ❌ 无效
Object.freeze:完全冻结对象
Object.freeze(obj) 比 seal 更严格。它不仅禁止增删属性,还禁止修改任何已有属性的值。
- 不能添加新属性
- 不能删除已有属性
- 不能修改已有属性的值(即使 writable: true,也无法更改)
- 所有属性变为不可写(writable: false)
const obj = { name: "Alice" };
Object.freeze(obj);
obj.name = "Bob"; // ❌ 无效(严格模式报错)
obj.age = 25; // ❌ 无效
delete obj.name; // ❌ 无效
两者都不处理深层对象
需要注意的是,seal 和 freeze 都是浅操作。如果对象的属性是引用类型(如对象或数组),其嵌套内容仍可能被修改。
立即学习“Java免费学习笔记(深入)”;
const obj = { user: { name: "Alice" } };
Object.freeze(obj);
obj.user.name = "Bob"; // ✅ 成功!内部对象未被冻结
若要彻底冻结,需递归调用 freeze 或使用深冻结工具函数。
基本上就这些。seal 保留属性可写性,freeze 则全面锁定。根据需求选择即可。










