configurable 是 javascript 属性描述符中控制属性是否可被删除、重定义或类型转换的底层开关;设为 false 后,delete、object.defineproperty 修改描述符及数据/访问器属性互转均失效,且不可逆。

configurable 是 JavaScript 属性描述符中最底层的“锁定开关”,它不控制值能不能改,而是决定这个属性本身还能不能被重新定义——删、改规则、换类型,全看它。
configurable 控制的三件关键事情
设为 false 后,以下操作全部失效:
- 用
delete obj.prop删除该属性(非严格模式返回false,严格模式直接抛TypeError) - 用
Object.defineProperty()修改enumerable、writable(仅允许true → false)、configurable自身(false不可逆) - 把数据属性(含
value)和访问器属性(含get/set)互相转换
不同创建方式,默认 configurable 值差异极大
这个默认值差异是多数人踩坑的源头:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 对象字面量
{ a: 1 }或点号/方括号赋值obj.b = 2→configurable: true(可删、可重定义) - 用
Object.defineProperty(obj, 'c', { value: 3 })且未显式传configurable→ 默认false(不可删、不可改规则) -
var声明的全局变量(如挂载到window上)→configurable: false -
let/const声明的绑定 → 不挂全局对象,也不可配置(引擎限制,非 defineProperty 导致)
configurable 和 writable 的真实关系
很多人误以为 writable: false 就锁死了值,其实不是:
- 只要
configurable: true,就能用defineProperty把writable改回true,再赋新值 - 一旦
configurable: false,writable就被固化:只能从true改成false,反之不行;其他描述符也一律冻结 - 所以真正“防篡改”的组合通常是
{ writable: false, configurable: false },比如Math.PI
典型使用场景与建议
设 configurable: false 不是炫技,而是有明确防护意图:
- 保护常量:确保核心值不被意外删除或重定义,例如框架中预置的
API_BASE_URL - 锁定枚举字段:防止业务代码
delete config.env或把config.mode = 'dev'改成 getter - 配合
enumerable: false隐藏内部属性(如_id),避免出现在for...in或JSON.stringify中 - 慎用在开发阶段:一旦设为
false就不可撤回,调试时建议先保留true,上线前再锁定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










