Object.defineProperty精细化控制属性需正确设置writable、enumerable、configurable和value/get/set:writable为false时不可赋值;enumerable为false则不参与遍历;configurable为false后无法删除或修改描述符;数据描述符(value/writable)与访问器描述符(get/set)互斥。

用 Object.defineProperty 精细化控制属性,核心在于理解并正确设置描述符(descriptor)中的四个关键特性:`writable`、`enumerable`、`configurable` 和 `value`(或 `get`/`set`)。它不是简单赋值,而是对属性行为的底层定义。
控制属性是否可写(writable)
设为 false 后,该属性值无法被重新赋值。严格模式下会抛错,非严格模式下静默失败。
- 默认值是
false—— 这和直接用obj.prop = value定义的属性行为完全不同(后者默认writable: true) - 一旦
configurable: false,后续不能再把writable从false改回true - 若同时使用
get/set,就不能再设value或writable,否则报错
控制属性是否可枚举(enumerable)
决定该属性会不会出现在 for...in、Object.keys()、JSON.stringify() 等枚举操作中。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 默认值是
false,所以用defineProperty添加的属性默认“隐身”于遍历 -
enumerable: false的属性仍可通过obj.prop直接读写(只要writable允许) - 常用于隐藏内部状态字段,比如
_counter或__version
控制属性是否可配置(configurable)
这是最严格的开关:设为 false 后,该属性既不能被 delete,也不能再用 defineProperty 修改其任何特性(除了 writable: true 时可改 value)。
立即学习“Java免费学习笔记(深入)”;
- 默认值也是
false,意味着你定义后就“锁死”了该属性的元信息 - 一旦
configurable: false,连enumerable和writable都不可再调用defineProperty修改 - 想删属性或彻底重定义?必须先确保
configurable: true
区分数据描述符与访问器描述符
描述符分两类,不能混用:
-
数据描述符:含
value+writable,适合定义普通值属性 -
访问器描述符:含
get+set,适合实现计算属性、数据劫持或副作用逻辑(如 Vue 2 响应式) - 两者互斥 —— 同时出现
value和get会直接报错

















