configurable: false 禁止删除属性、修改描述符(enumerable/configurable自身)、数据与访问器属性互转,且 writable 仅允许 true→false 单向降级;默认值因创建方式而异,可用 getOwnPropertyDescriptor 查看。

configurable 是 JavaScript 属性描述符中最底层的“锁定开关”,它不控制属性值能否被读写,而是决定这个属性本身还能不能被改动——包括删、改描述符、换类型。
configurable: false 后哪些操作被禁止?
一旦设为 false,以下三类行为全部失效:
- 用
delete删除该属性(非严格模式返回false,严格模式直接抛TypeError) - 用
Object.defineProperty()修改enumerable、configurable自身,或把数据属性转成访问器属性(或反之) - 把
writable从false改回true(哪怕当前是false,也不允许翻转)
唯一允许的例外:writable 只能单向降级
当 configurable: false 且当前 writable: true 时,可以调用 Object.defineProperty() 把 writable 设为 false;但反过来不行——writable: false 之后再想设回 true,无论 configurable 是真是假都会失败。
这个例外只适用于数据属性,且仅限 true → false 这一方向。
立即学习“Java免费学习笔记(深入)”;
不同创建方式下 configurable 默认值差异大
是否能删、能否重配,往往不是你主动设的,而是创建方式悄悄决定的:
- 对象字面量或点号/中括号赋值(如
obj.a = 1)→configurable: true - 用
Object.defineProperty()显式定义但没传configurable→ 默认false -
var声明的全局变量(挂到window上)→configurable: false -
let/const声明的绑定 → 不挂全局,也不可配置(引擎级限制)
如何快速验证当前属性的 configurable 状态?
最直接的方式是调用:
Object.getOwnPropertyDescriptor(obj, 'prop')
返回对象里明确包含 configurable 字段,一眼就能确认。配合 delete 和 defineProperty 尝试,也能观察到是否静默失败或报错,从而反推其状态。


















