Object.seal()密封对象,禁止增删属性但可修改值;Object.freeze()冻结对象,禁止增删改属性及描述符,实现完全不可变,二者均不递归处理嵌套属性。

JavaScript 提供了多种方式来限制对象的修改,其中 Object.freeze() 和 Object.seal() 是两个重要的方法。它们都能防止对象被随意更改,但作用程度不同。
Object.seal():密封对象,禁止增删属性
Object.seal() 方法会封闭一个对象,阻止新属性被添加,同时阻止已有属性被删除。但允许修改现有属性的值。
- 不能添加新属性
- 不能删除已有属性
- 可以修改已有属性的值
- 属性描述符不能更改(configurable: false)
示例:
const obj = { name: 'Alice', age: 25 };
Object.seal(obj);
obj.name = 'Bob'; // ✅ 允许
obj.city = 'Beijing'; // ❌ 无效,无法添加
delete obj.age; // ❌ 无效,无法删除
console.log(obj); // { name: 'Bob', age: 25 }
Object.freeze():冻结对象,完全不可变
Object.freeze() 比 seal 更严格,它不仅阻止添加和删除属性,还禁止修改任何现有属性的值。
立即学习“Java免费学习笔记(深入)”;
- 不能添加新属性
- 不能删除已有属性
- 不能修改属性值(writable: false)
- 不能重新配置属性(如 configurable、enumerable)
示例:
const obj = { name: 'Alice', age: 25 };
Object.freeze(obj);
obj.name = 'Bob'; // ❌ 无效(严格模式下报错)
obj.city = 'Beijing'; // ❌ 无效
delete obj.age; // ❌ 无效
console.log(obj); // { name: 'Alice', age: 25 }
关键区别总结
| 操作 | 普通对象 | Object.seal() | Object.freeze() |
|---|---|---|---|
| 添加属性 | ✅ | ❌ | ❌ |
| 删除属性 | ✅ | ❌ | ❌ |
| 修改属性值 | ✅ | ✅ | ❌ |
| 修改属性描述符 | ✅ | ❌ | ❌ |
注意:两者都只作用于对象自身,不处理深层嵌套属性。若需深度冻结,需递归调用 freeze。
基本上就这些。根据是否允许修改属性值来选择 seal 或 freeze。










