真正保护不可变配置项需组合声明、冻结、封装和静态约束四层手段;const仅防重新赋值,object.freeze实现浅层冻结,深冻结应对嵌套结构,模块封装与eslint等构成开发期防护。

用 const 声明配置变量只是第一步,真正保护不可变配置项需要组合声明、冻结、封装和静态约束四层手段。单独用 const 只能防止重新赋值,对对象内部修改完全无效。
const 声明是基础防线
const 确保变量引用不被覆盖,适合声明配置对象的顶层标识符。它对基本类型(字符串、数字、布尔)提供完整保护;对对象或数组,仅锁定引用地址,不阻止内部属性变更。
- ✅ 正确用法:
const API_CONFIG = { baseUrl: 'https://api.example.com' }; - ❌ 误以为安全:
API_CONFIG.baseUrl = 'https://hack.api';不报错,实际已篡改 - ⚠️ 注意:即使在严格模式下,这种修改也不会触发错误,除非配合
Object.freeze
Object.freeze 实现浅层冻结
Object.freeze() 让对象自身不可添加、删除或重配置属性,且所有自有属性默认设为 writable: false。但它只作用于对象第一层,嵌套对象仍可修改。
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- ✅ 冻结后赋值失败(严格模式报错):
Object.freeze(API_CONFIG); API_CONFIG.baseUrl = 'x'; // TypeError - ❌ 浅层局限:
API_CONFIG.features = { auth: true }; // ❌ 失败,但API_CONFIG.features.auth = false;仍成功 - ? 提示:适合结构扁平、无深层嵌套的配置,如状态码映射表
const HTTP_STATUS = Object.freeze({ OK: 200, NOT_FOUND: 404 });
深冻结(deepFreeze)应对嵌套结构
业务配置常含多层嵌套(如 api.timeout、features.auth.enabled),必须递归冻结每一层 plain object 或 array。
- ✅ 可靠实现要点:跳过原始值、函数、Date 等非 Plain 类型;用 WeakMap 防循环引用;先冻结子节点再冻结父节点
- ✅ 加载时机关键:必须在任何模块 import 之前完成深冻结,否则其他模块拿到的是未冻结的原始引用
- ✅ 示例场景:版本号、API 路径、功能开关等核心业务常量,都应走深冻结流程
模块封装 + ESLint + 只读导出构成开发期防护
运行时冻结是最后一道防线,开发阶段就要堵住漏洞。
- ✅ 导出方式:只暴露冻结后的常量,不导出原始对象或构造函数
- ✅ ESLint 规则:启用
no-param-reassign和no-const-assign,编辑器实时提示误操作 - ✅ 配置模块设计:避免混入函数或类实例——它们无法被安全冻结,且可能携带隐藏状态
- ✅ TypeScript 辅助:配合
as const推导字面量类型,进一步限制运行时取值范围
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










