Object.freeze用于浅冻结对象,使其不可扩展、不可删除或修改属性,但嵌套对象需手动冻结;返回原对象,可用Object.isFrozen检测。

Object.freeze 用于彻底冻结一个对象,使其不可扩展、不可删除属性、不可修改属性值(包括属性描述符),且所有嵌套对象也需手动冻结才生效。
冻结对象的基本用法
调用 Object.freeze(obj) 后,对象变成只读状态。尝试修改属性、添加新属性或删除属性都会静默失败(严格模式下会抛出 TypeError)。
- 原生类型属性(如字符串、数字)值无法被修改
- 不能新增属性,也不能删除已有属性
- 不能改变属性的可写性、可枚举性、可配置性
- 返回原对象引用,不是副本
示例:
const obj = { name: 'Alice', age: 30 };
Object.freeze(obj);
obj.name = 'Bob'; // 无效,name 仍是 'Alice'
obj.job = 'Engineer'; // 无效,job 不会添加
delete obj.age; // 无效,age 仍存在
console.log(obj); // { name: 'Alice', age: 30 }
冻结对引用类型属性无效
Object.freeze 只做浅冻结 —— 它不会递归冻结嵌套的对象或数组。如果属性值是对象或数组,其内部仍可被修改。
立即学习“Java免费学习笔记(深入)”;
- 冻结后,
obj.nested.prop = 123依然有效 - 需要手动递归调用
Object.freeze处理嵌套结构 - 常见做法:结合
Object.keys和循环,或使用工具函数深冻结
示例:
const obj = { user: { name: 'Alice' }, tags: ['js'] };
Object.freeze(obj);
obj.user.name = 'Bob'; // ✅ 仍然成功!
obj.tags.push('react'); // ✅ 仍然成功!
// 正确做法:手动冻结嵌套项
Object.freeze(obj.user);
Object.freeze(obj.tags);
判断对象是否已被冻结
可用 Object.isFrozen(obj) 检查对象是否处于冻结状态。注意它只检测对象本身,不检查嵌套对象。
- 返回
true表示对象不可扩展、所有属性不可配置、所有数据属性不可写 - 即使部分嵌套未冻结,只要顶层满足条件,
isFrozen仍返回true - 常用于调试或运行时校验配置对象是否真正只读
示例:
const conf = { api: 'https://api.example.com' };
Object.freeze(conf);
console.log(Object.isFrozen(conf)); // true
const nested = { data: { x: 1 } };
Object.freeze(nested);
console.log(Object.isFrozen(nested)); // true
console.log(Object.isFrozen(nested.data)); // false ← 需单独检查
适用场景与注意事项
冻结适合定义常量配置、枚举、不可变数据结构等,但要注意实际约束力取决于使用方式。
- 常用于模块导出的静态配置(如 API 地址、状态码映射)
- 与
const声明配合使用:const防止重新赋值,freeze防止内容篡改 - 不能撤销冻结,也没有“解冻”方法
- 性能开销极小,但深冻结需谨慎,避免无限循环(如循环引用)
推荐组合写法:
const STATUS = Object.freeze({
PENDING: 'pending',
SUCCESS: 'success',
ERROR: 'error'
});


















