configurable 是属性描述符中控制属性能否被重新定义的底层开关;configurable: false 时禁止删除属性、修改描述符及转换属性类型,且 writable 只能从 true 改为 false;对象字面量默认 configurable: true,Object.defineProperty 默认 false;配合 writable 和 enumerable 可实现三重防护。

configurable 是属性描述符中最底层的“锁定开关”,它不控制值能不能改,而是决定这个属性本身还能不能被重新定义。
configurable: false 时禁止的操作
一旦设为 false,以下行为全部被阻止:
- 用
delete删除该属性(非严格模式返回false,严格模式直接报TypeError) - 调用
Object.defineProperty()修改enumerable、configurable自身,或把数据属性和访问器属性互相转换 - 把
writable从false改回true(哪怕原先是true,也只允许true → false这一种修改)
不同创建方式下 configurable 默认值不同
这个细节直接影响能否删属性,容易踩坑:
- 对象字面量直接赋值(如
obj.a = 1或{ a: 1 }):默认configurable: true - 用
Object.defineProperty()显式定义但未指定configurable:默认false -
var声明的全局变量,在全局对象上绑定的属性默认configurable: false -
let/const声明的绑定不挂载到全局对象,也不可配置(引擎级限制)
configurable 和 writable 的配合关系
很多人误以为 writable: false 就彻底锁死了属性,其实不是:
立即学习“Java免费学习笔记(深入)”;
- 只要
configurable: true,就能用defineProperty把writable改回true,再赋新值 - 一旦
configurable: false,writable就被固化:只能从true变false,不可逆,其他描述符也全被冻结
实际使用建议
想真正保护一个常量或关键配置项,推荐组合设置:
- 设
configurable: false锁死定义规则 - 设
writable: false防止意外赋值 - 设
enumerable: false让它不在for...in或JSON.stringify中暴露
这种三重防护能有效防止误删、误改、误遍历。


















