configurable 是 Object.defineProperty 能否再次操作同一属性的关键开关;设为 false 后,除 writable 从 true 降级为 false 外,修改 enumerable、configurable 自身、属性类型或 value(当 writable: false)均抛出 TypeError。

configurable 是决定 Object.defineProperty 能否再次操作同一属性的关键开关。设为 false 后,绝大多数后续 defineProperty 调用都会报错,只有极少数例外允许。
configurable: false 时哪些 defineProperty 会报错
一旦属性的 configurable 为 false,再调用 Object.defineProperty 修改该属性,以下操作全部失败并抛出 TypeError: Cannot redefine property:
- 修改 enumerable(无论从 true 改 false,还是 false 改 true)
- 把 configurable 自身设回 true(不可逆)
- 把数据属性改成访问器属性(例如加 get/set)
- 把访问器属性改成数据属性(例如删掉 get、加 value)
- 修改 value(前提是 writable: false)
configurable: false 时唯一允许的 defineProperty 操作
并非所有操作都被禁止——仅有一个方向被特许:
- 仅允许将 writable: true → writable: false(前提是当前 writable 确实为 true)
- value 可以修改,但仅限于 writable: true 时(本质是赋值行为,不是 defineProperty 的“描述符变更”)
例如:Object.defineProperty(obj, 'x', { writable: false }) 在 configurable: false 且原 writable 为 true 时能成功;但反过来(false → true)或改 enumerable 就立刻报错。
立即学习“Java免费学习笔记(深入)”;
默认值陷阱:defineProperty 不写 configurable 就等于 false
很多人忽略的是:用 Object.defineProperty 显式定义属性时,如果不传 configurable,它的默认值就是 false。这意味着:
- 后续几乎无法再用 defineProperty 调整这个属性(除了上面提到的 writable 单向降级)
- 和对象字面量
{ a: 1 }或点号赋值obj.b = 2创建的属性(默认 configurable: true)行为完全不同
想留出修改余地,显式写上 configurable: true 是必要习惯。
报错的本质:configurable 锁死的是“描述符结构”,不是值
报错不是因为值变了,而是因为 defineProperty 尝试改变属性的元信息规则。configurable: false 相当于给属性贴了张封条:“此属性定义已固化”。哪怕只是想让它变得可枚举,也会触发报错——因为它动了描述符本身,而这个动作已被禁止。


















