configurable 是对象属性描述符中控制属性定义规则是否可修改的布尔值:禁止 delete、禁止修改 enumerable/writable/configurable、禁止数据与访问器属性互转;其默认值因创建方式而异,常用于保护常量或锁定配置。

configurable 是 JavaScript 对象属性描述符中的一个关键布尔值,它控制的是“这个属性本身是否还能被改动”——不是改它的值,而是改它的定义规则。
configurable 决定三件事
当 configurable: false 时,以下操作全部被禁止:
- 用
delete删除该属性(非严格模式返回false,严格模式直接报错) - 用
Object.defineProperty()修改enumerable、writable(仅允许true → false)、configurable自身(false不可逆) - 把数据属性改成访问器属性,或反过来(比如从
{ value: 1 }改成{ get() { return 1 } })
configurable 和 writable 的关系很特别
writable 看似管“能不能赋新值”,但它其实依赖 configurable 是否开放权限:
- 如果
configurable: true,哪怕writable: false,你仍能用defineProperty把writable改回true,再改值 - 但一旦
configurable: false,writable就被“冻结”了:只能从true变false,不能反向,也不能动其他描述符
不同创建方式,configurable 默认值不同
这个细节常被忽略,却直接影响能否删属性:
- 对象字面量或点号/方括号赋值(如
obj.a = 1)→configurable: true(可删、可改) - 用
Object.defineProperty()显式定义且未传configurable→ 默认false(不可删、不可改) -
var声明的全局变量(挂到window上)→configurable: false;let/const不挂全局,也不可配置(引擎限制)
典型使用场景
设 configurable: false 不是为了炫技,而是有明确目的:
- 保护核心常量:比如
Math.PI就是configurable: false, writable: false - 锁定配置项:防止业务代码意外
delete config.API_URL或篡改枚举性 - 配合
enumerable: false隐藏内部字段(如id不出现在for...in中)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











