const仅防止变量重新赋值,不阻止对象属性修改;object.freeze()可冻结对象自身(浅层),禁止增删改属性;嵌套对象需手动深度冻结;object.seal()和object.preventextensions()提供中低强度保护。

用 const 声明对象,只是防止变量被重新赋值,**并不阻止对象内部属性的修改**。要真正冻结对象、禁止增删改属性,需要用 Object.freeze()。
为什么 const 不能冻结对象内容?
const 保证的是“绑定不可变”——即该变量名始终指向同一个内存地址。但若该地址存的是一个对象,对象本身的属性仍可读写。
例如:
const user = { name: 'Alice' };
user.name = 'Bob'; // ✅ 允许:修改属性值
user.age = 30; // ✅ 允许:新增属性
delete user.name; // ✅ 允许:删除属性
user = { name: 'Charlie' }; // ❌ 报错:不能重新赋值
用 Object.freeze() 冻结对象
Object.freeze() 会冻结对象本身:禁止添加、删除、修改已有属性(包括属性描述符),且冻结是浅层的。
使用方式:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 调用
Object.freeze(obj),返回原对象(不创建新对象) - 通常建议在声明后立即冻结,避免中间状态被修改
- 可在开发环境配合
Object.isFrozen()检查是否已冻结
const user = Object.freeze({ name: 'Alice', role: 'admin' });
user.name = 'Bob'; // ⚠️ 静默失败(非严格模式)或报错(严格模式)
user.role = 'user'; // 同上
user.age = 25; // 无效
delete user.name; // 无效
console.log(Object.isFrozen(user)); // true
注意:冻结是浅层的
Object.freeze() 不递归冻结嵌套对象。如果属性值本身是对象,那个对象仍可修改。
const config = Object.freeze({
db: { host: 'localhost', port: 5432 },
debug: true
});
config.debug = false; // ❌ 失败(顶层冻结)
config.db.port = 5433; // ✅ 成功!db 对象未被冻结
如需深度冻结,需手动递归调用 Object.freeze(),或使用第三方库(如 deep-freeze),但要注意性能与循环引用问题。
更严格的替代方案:Object.seal() 和 Object.preventExtensions()
根据需求强度选择:
-
Object.preventExtensions(obj):禁止添加新属性,但可修改/删除已有属性 -
Object.seal(obj):禁止添加/删除属性,但允许修改已有属性值 -
Object.freeze(obj):三者中最严,完全禁止任何变更(等价于 seal + 所有属性writable: false)
三者都只作用于对象自身,不涉及原型链或嵌套对象。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










