Object.freeze 是 JavaScript 中用于浅冻结对象的方法,使对象第一层属性不可添加、删除、修改及重定义描述符,但嵌套对象仍可变;需递归实现深冻结,且可用 Object.isFrozen() 检测冻结状态。

Object.freeze 是 JavaScript 中用于彻底冻结对象的方法,它让对象变成“只读”状态:不能添加、删除或修改属性,也不能更改属性的可配置性、可枚举性或可写性。
冻结对象的基本用法
调用 Object.freeze(obj) 会返回原对象(不是副本),并使其不可变:
- 已有属性值无法被修改(包括基本类型和引用类型)
- 不能新增属性
- 不能删除属性
- 不能重定义属性描述符(如把 writable 设为 true)
示例:
const obj = { name: 'Alice', age: 30 };Object.freeze(obj);
obj.name = 'Bob'; // 无效,严格模式下会报错
obj.city = 'Beijing'; // 无效,属性不会被添加
delete obj.age; // 无效,属性不会被删除
console.log(obj); // { name: 'Alice', age: 30 }
注意:freeze 只做浅冻结
Object.freeze 不递归冻结嵌套对象,只冻结第一层属性:
立即学习“Java免费学习笔记(深入)”;
- 如果某个属性值是另一个对象,该对象本身仍可被修改
- 需要手动递归冻结,或使用工具函数实现深冻结
示例:
const person = {name: 'Alice',
address: { city: 'Shanghai', zip: '200000' }
};
Object.freeze(person);
person.name = 'Bob'; // ❌ 失败
person.address.city = 'Beijing'; // ✅ 成功!嵌套对象未被冻结
如何实现深冻结(Deep Freeze)
若需完全冻结嵌套结构,可写一个递归函数:
function deepFreeze(obj) {if (obj && typeof obj === 'object') {
Object.getOwnPropertyNames(obj).forEach(prop => {
if (obj[prop] && typeof obj[prop] === 'object') {
deepFreeze(obj[prop]);
}
});
}
return Object.freeze(obj);
}
使用后,所有层级的对象都不可变。但要注意:循环引用会导致无限递归,实际项目中建议配合检测处理。
冻结前后的判断与兼容性
可用 Object.isFrozen() 检查对象是否已被冻结:
const obj = { a: 1 };console.log(Object.isFrozen(obj)); // false
Object.freeze(obj);
console.log(Object.isFrozen(obj)); // true
兼容性良好,支持所有现代浏览器及 Node.js(ES5+)。在严格模式下,尝试修改冻结对象会抛出 TypeError;非严格模式下则静默失败。


















