Object.freeze 实现对象浅层只读,配合 const 声明可确保变量与属性均不可变;需手动递归冻结嵌套对象,冻结前可用 defineProperty 隐藏属性,isFrozen 可校验冻结状态。

Object.freeze 能让对象变成“只读快照”,无法增删改属性,适合保护不可变的核心配置(比如 API 地址、环境常量、枚举值等)。
冻结对象本身,但不递归冻结嵌套对象
Object.freeze 只做浅冻结:它会阻止对目标对象自身的修改(添加、删除、重写属性),但若属性值是另一个对象,那个对象仍可被修改。
- ✅ 不能改顶层属性名或值(如 config.API_URL = 'xxx' 会静默失败)
- ⚠️ 若 config.features = { auth: true },则 config.features.auth = false 仍会成功
- ? 解决方法:手动递归冻结,或用 Object.freeze(Object.assign({}, obj)) 冻结副本(仅适用于一层)
配合 const 声明,增强语义和运行时防护
const 只防止变量重新赋值,不防对象内部修改;和 Object.freeze 搭配才真正实现“不可变”:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- ❌ let config = { API_URL: 'https://api.example.com' }; Object.freeze(config); —— config 仍可被重新赋值
- ✅ const config = Object.freeze({ API_URL: 'https://api.example.com' }); —— 变量不可重赋,对象不可修改
冻结前建议先 seal 或 defineProperty 控制属性特性
Object.freeze 会自动将所有自有属性设为 writable: false、configurable: false、enumerable: true。但如果你希望某些属性不可遍历(比如调试用的私有字段),需提前用 Object.defineProperty 设置 enumerable: false:
立即学习“Java免费学习笔记(深入)”;
- 先定义隐藏字段:Object.defineProperty(config, '_debug', { value: true, writable: false, enumerable: false, configurable: false })
- 再冻结:Object.freeze(config)
- 这样 _debug 不会出现于 for...in 或 Object.keys() 中,且无法被修改或删除
检查是否已冻结,便于调试和防御性编程
可用 Object.isFrozen(obj) 判断对象是否已被冻结,适合在模块初始化后校验,或在工具函数中做安全兜底:
- if (!Object.isFrozen(config)) { throw new Error('Core config must be frozen'); }
- 注意:Object.isFrozen 返回 true 仅表示对象自身被冻结,不保证嵌套对象也被冻结

















