属性描述符定义单个属性权限,冻结则全局锁定对象;object.freeze()将自有属性writable和configurable设为false并禁止扩展,不递归冻结嵌套对象,且冻结后任何描述符修改均无效。

JavaScript 中属性描述符和对象冻结是控制对象可变性的核心机制。理解它们的关系,关键在于区分“描述符定义的权限”和“冻结施加的全局限制”——前者决定单个属性能否被修改,后者则从对象层面锁死所有变更可能。
属性描述符决定了单个属性的行为边界
每个属性都有对应的描述符(descriptor),包含 value、writable、enumerable、configurable 等字段。这些字段共同定义该属性是否可读、可写、可遍历、可删除或可重新配置。
- writable: false 时,即使对象未冻结,也无法给该属性赋新值(严格模式下报错,非严格模式静默失败)
-
configurable: false 后,无法 delete 属性,也不能再次调用
Object.defineProperty()修改其描述符(除非 writable 为 true 且想改 value) - 使用
Object.defineProperty(obj, key, descriptor)可精确设置描述符;Object.getOwnPropertyDescriptor(obj, key)可查看当前描述符
冻结(freeze)是对整个对象的不可变性封装
Object.freeze(obj) 并不是简单地把每个属性设为 writable: false,而是同时执行三项操作:
- 将所有自有属性的 writable 设为
false - 将所有自有属性的 configurable 设为
false - 调用
Object.preventExtensions(obj),禁止添加新属性
注意:冻结只作用于对象**自身属性**,不递归冻结嵌套对象。若需深层冻结,需手动遍历或借助库实现。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
判定冻结后状态的实用方法
判断一个对象是否被冻结,不能只看属性是否可写,而应综合检查三个层面:
- 用
Object.isFrozen(obj)直接返回布尔值——这是最可靠的方式 - 用
Object.isSealed(obj)检查是否密封(preventExtensions + configurable: false),冻结的对象一定是密封的,但反之不成立 - 用
Object.isExtensible(obj)判断是否允许扩展,冻结后必为false
例如:const obj = { a: 1 }; Object.freeze(obj); console.log(Object.isFrozen(obj)); // true
冻结与描述符冲突时的实际表现
如果先设置某个属性为 configurable: false, writable: true,再调用 Object.freeze(),该属性仍会被强制改为 writable: false。反过来,如果已冻结对象,再尝试用 defineProperty 修改任何描述符(包括 writable 或 configurable),都会失败(严格模式抛错,非严格模式静默忽略)。
也就是说:冻结后的对象,其所有自有属性的描述符都处于“锁定态”,任何试图绕过冻结机制的操作均无效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










