不能。当 configurable: false 时,javascript 禁止数据属性与存取器属性相互转换,包括增删 get/set 或 value,仅允许修改 value(writable 为 true 时)和将 writable 从 true 改为 false。

不能。当 configurable: false 时,JavaScript 明确禁止将数据属性与存取器属性(即带 get/set 的属性)相互转换。
configurable: false 禁止的类型转换
一旦属性被定义为 configurable: false,以下操作全部失效:
- 把一个有
value和writable的数据属性,改成含get或set的存取器属性 - 把一个已有
get/set的存取器属性,改成带value的数据属性 - 哪怕只改其中一项(比如删掉
get、补上value),也会触发 TypeError
为什么设计成不可逆
这是为了保证对象结构的稳定性。configurable 控制的是“描述符本身是否可变”,而类型转换本质是重写整个描述符结构——包括从数据属性的 value/writable 切换到存取器属性的 get/set,这属于底层定义变更。
即使你只调用一次 Object.defineProperty 尝试切换,只要原属性是 configurable: false,引擎就会拒绝,并抛出 TypeError(严格模式下)或静默失败(非严格模式下,但实际不生效)。
能改什么?仅限 value 和部分 writable
在 configurable: false 前提下,唯一允许的修改是:
-
value:随时可改(只要writable: true) -
writable:可以从true改为false(降权允许),但不能反向(false → true不允许) -
enumerable、configurable自身、get/set与value的共存关系:全部锁定,不可动
如何验证当前配置
用 Object.getOwnPropertyDescriptor(obj, 'prop') 查看完整描述符,重点关注:
-
configurable是否为false - 是否存在
get或set(存取器属性) - 是否存在
value(数据属性)
若两者同时存在或尝试混用,说明定义有误;若 configurable 为 false 还想换类型,只能重建对象或放弃该约束。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











