const只能防止对象变量被重新赋值,不能阻止其属性被修改;需用Object.freeze()浅冻结,或deepFreeze()递归冻结嵌套对象,配合TypeScript readonly等进一步保障。

用 const 声明对象只能防止变量被重新赋值,**不能阻止对象内部属性被修改**。要真正“锁定”配置对象不被意外修改,需要结合 Object.freeze() 或更严格的 Object.preventExtensions() 和 Object.seal(),甚至递归冻结嵌套对象。
只用 const 不够:它只锁引用,不锁内容
const 保证的是变量绑定不可变——你不能再把该变量指向另一个对象,但对象本身的属性仍可增、删、改:
const config = { api: 'https://api.example.com', timeout: 5000 };
config.timeout = 10000; // ✅ 允许!属性被修改
config.version = 'v2'; // ✅ 允许!新增属性
delete config.api; // ✅ 允许!删除属性
config = {}; // ❌ 报错:Assignment to constant variable
基础锁定:用 Object.freeze() 冻结一层对象
Object.freeze() 会让对象变为**不可扩展、不可删除、不可重配置**,且所有数据属性变为只读(前提是它们本身是数据属性,不是 getter/setter):
- 属性值不能被修改(对原始值有效)
- 不能添加新属性
- 不能删除已有属性
- 不能修改属性的可枚举性、可配置性、可写性
const config = Object.freeze({
api: 'https://api.example.com',
timeout: 5000,
headers: { 'Content-Type': 'application/json' }
});
config.timeout = 10000; // ⚠️ 静默失败(非严格模式)或报错(严格模式)
config.newKey = 'test'; // ❌ 无效
delete config.api; // ❌ 无效
⚠️ 注意:Object.freeze() 是**浅冻结**——嵌套对象(如 headers)依然可变:
立即学习“Java免费学习笔记(深入)”;
config.headers['Content-Type'] = 'text/plain'; // ✅ 仍然可以改!
彻底锁定:递归冻结嵌套对象
如果配置含多层嵌套,需手动递归冻结:
function deepFreeze(obj) {
if (obj && typeof obj === 'object' && !Object.isFrozen(obj)) {
Object.keys(obj).forEach(key => {
deepFreeze(obj[key]);
});
return Object.freeze(obj);
}
return obj;
}
const config = deepFreeze({
api: 'https://api.example.com',
timeout: 5000,
headers: { 'Content-Type': 'application/json' },
retry: { max: 3, delay: 100 }
});
// ✅ 所有层级都不可修改
进阶防护:配合 const + freeze + 类型检查(可选)
生产环境还可叠加以下实践提升安全性:
- 在 TypeScript 中定义
readonly接口或as const断言,让编辑器和编译器提前报错 - 导出前校验是否已冻结:
console.assert(Object.isFrozen(config), 'Config must be frozen') - 避免在运行时动态修改配置——所有配置应在初始化阶段一次性冻结并导出
// config.js
export const CONFIG = Object.freeze({
API_URL: 'https://api.example.com',
TIMEOUT_MS: 5000
});


















