Object.freeze()仅冻结对象自身属性,不递归冻结嵌套对象;可防止属性修改、添加、删除及配置变更,但不影响变量绑定;需手动实现深度冻结,配合const和TypeScript增强数据安全。

JavaScript 中无法真正“冻结声明的变量”,但可以通过 Object.freeze() 冻结**对象本身**,使其属性不可被修改、添加或删除。注意:这不作用于变量绑定(比如 const 声明的变量名),而是作用于对象的内部状态。
冻结对象属性(不是变量)
Object.freeze() 使对象变为浅冻结——即只冻结对象自身的可枚举属性,不递归冻结嵌套对象。
- 被冻结对象的属性不能被修改值(对基本类型有效)
- 不能新增或删除已有属性
- 不能改变属性的可配置性(configurable)或可写性(writable)
- 对非对象值(如字符串、数字、布尔)调用会直接返回原值,无效果
示例:
const person = { name: 'Alice', age: 30 };
Object.freeze(person);
person.name = 'Bob'; // 无效(严格模式下报错)
person.job = 'Engineer'; // 无效
delete person.age; // 无效
console.log(person.name); // 'Alice'
console.log(Object.isFrozen(person)); // true
注意:冻结不等于 const 声明
const 只防止变量重新赋值,不阻止对象内部变化;Object.freeze() 才保护对象内容。
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
立即学习“Java免费学习笔记(深入)”;
-
const obj = { x: 1 };→ 不能写obj = { y: 2 },但可以写obj.x = 2 -
const obj = Object.freeze({ x: 1 });→ 连obj.x = 2也无效
深度冻结需手动递归
默认 Object.freeze() 是浅冻结。若对象含嵌套对象,需自行递归处理:
function deepFreeze(obj) {
if (obj && typeof obj === 'object') {
Object.getOwnPropertyNames(obj).forEach(prop => {
deepFreeze(obj[prop]);
});
}
return Object.freeze(obj);
}
const data = { user: { name: 'Tom' }, list: [1, 2] };
deepFreeze(data);
data.user.name = 'Jerry'; // 无效
检查是否已冻结
用 Object.isFrozen(obj) 判断对象是否被冻结(返回布尔值)。注意它只检测对象自身,不检查原型链上的属性。
- 返回
true:对象是冻结的(所有自有属性不可配置、不可写) - 返回
false:可能未冻结,或部分属性仍可配置/可写
不复杂但容易忽略:冻结是运行时防护,不能替代设计约束或类型系统;生产中建议配合 const + Object.freeze() + TypeScript 类型只读标注(如 readonly)共同增强数据安全性。

















