object.freeze()可冻结对象使其不可修改,但仅浅冻结,嵌套对象需手动递归冻结;其他防护方式包括preventextensions()和seal(),强度依次递增。

冻结对象最直接的方式是用 Object.freeze(),它能让对象进入不可修改状态:不能添加、删除、改值,也不能重定义属性描述符。但要注意,它只做浅冻结,嵌套对象不受影响。
怎么调用 Object.freeze
传入目标对象即可,操作是就地修改,返回原对象:
-
Object.freeze(obj)后,obj.prop = newValue在严格模式下报错,非严格模式下静默失败 - 尝试
obj.newKey = 'x'或delete obj.existing都无效 - 不能通过
Object.defineProperty修改已有属性的writable或configurable
为什么嵌套对象还能被改
Object.freeze() 不递归处理深层结构。比如:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
const conf = { api: 'v1', headers: { token: 'abc' } };Object.freeze(conf);-
conf.headers.token = 'xyz';依然成功 —— 因为headers本身没被冻结
需要深度冻结怎么办
得手动递归调用,同时避开循环引用和非对象类型:
- 先检查
typeof obj === 'object'且不为null - 用
Object.getOwnPropertyNames()获取所有自有属性名 - 对每个值为对象的属性,先递归冻结,再调用
Object.freeze(obj) - 建议加缓存(如 WeakMap)记录已处理对象,防止无限循环
其他防护等级可选
根据实际需求,不一定非要冻结:
-
Object.preventExtensions():只禁新增属性,其余都允许 -
Object.seal():禁新增、禁删除,但允许改已有属性值 - 三者防护强度递增:
freeze > seal > preventExtensions
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










