不能直接用对象字面量定义的属性批量修改描述符,必须用 Object.defineProperties() 显式设置;configurable 是关键开关,设为 false 后无法再修改其他描述符;稳妥做法是先用 getOwnPropertyDescriptors 获取再批量修改应用。

不能直接用对象字面量定义的属性批量修改描述符。
对象字面量属性的描述符默认不可配置
用 { name: 'Alice', age: 30 } 这种方式创建的对象,其属性的 configurable、enumerable、writable 默认都是 true,但这些描述符本身**无法通过字面量语法修改**。你只能用 API 显式设置。
比如下面这行代码无效:
const obj = { name: { value: 'Alice', writable: false } }; // ❌ 不是描述符写法,只是普通嵌套对象必须用 Object.defineProperties() 批量设置描述符
要给已有对象(包括字面量创建的)批量添加或修改属性描述符,唯一标准方法是 Object.defineProperties():
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 它接收目标对象和一个“描述符对象”,每个键对应属性名,值是完整描述符(含
value、writable、configurable等) - 即使属性已存在,也能重设描述符(前提是原
configurable: true) - 不支持混用数据描述符(
value+writable)和存取描述符(get/set)
注意 configurable 是关键开关
如果某个属性最初是字面量创建的(configurable: true),后续就能用 defineProperties 修改它的 writable 或 enumerable;但如果之前被设为 configurable: false,那之后连 writable 都不能再改(除非从 true 改为 false)。
例如:
Object.defineProperty(obj, 'name', { writable: false, configurable: false }); // 锁死,无法再调 defineProperties 修改它替代方案:先解构再重建描述符
若需对字面量对象“一次性设定所有属性为只读”,更稳妥的做法是:
- 用
Object.getOwnPropertyDescriptors()获取当前所有自有属性的描述符 - 遍历并修改每个描述符的
writable和configurable - 再用
Object.defineProperties()应用回去
这样既保留原始结构,又能统一控制行为。


















