configurable 是属性描述符中控制属性可配置性的布尔值:configurable: false 时属性不可删除、不可修改描述符(writable 从 true 改 false 除外)、不可转换属性类型;默认值因创建方式而异,字面量赋值为 true,defineproperty 未指定时为 false。

在 JavaScript 中,configurable 是属性描述符(property descriptor)中的一个布尔值,它直接决定该属性能否被删除、能否修改其描述符(比如 writable、enumerable、configurable 本身),以及能否从数据属性转为访问器属性(或反之)。
configurable: false 时无法删除属性
当一个属性的 configurable 为 false,调用 delete 操作符将失败(严格模式下抛出 TypeError,非严格模式下静默返回 false):
const obj = {};
Object.defineProperty(obj, 'name', {
value: 'Alice',
configurable: false
});
delete obj.name; // false(非严格模式)或 TypeError(严格模式)
console.log(obj.name); // 'Alice'
configurable: false 时无法修改属性描述符
一旦 configurable 设为 false,后续对同一属性调用 Object.defineProperty() 修改任何描述符(包括 writable、enumerable、configurable 自身)都会报错,除非是把 writable: true 改为 false(这个例外仅适用于数据属性):
-
Object.defineProperty(obj, 'name', { writable: false })✅ 允许(前提是原先是writable: true) -
Object.defineProperty(obj, 'name', { enumerable: true })❌ 报错 -
Object.defineProperty(obj, 'name', { configurable: true })❌ 报错(不可逆)
configurable 控制属性类型转换
只有 configurable: true 的属性,才能在数据属性和访问器属性之间切换。例如:
const obj = { age: 25 };
// 可以先定义为数据属性
Object.defineProperty(obj, 'age', { configurable: true });
// 然后改为 getter
Object.defineProperty(obj, 'age', {
get() { return 26; },
configurable: true
});
但如果 configurable: false,尝试用 defineProperty 把它改成 getter/setter,会立即报错。
默认情况下,var/let/const 声明和对象字面量属性的 configurable 值
不同方式创建的属性,configurable 默认值不同:
- 变量声明(
var/let/const)绑定到全局对象(如浏览器中window)时,configurable为false(所以不能被delete) - 对象字面量中的属性(如
{ a: 1 })或使用点号/方括号赋值(obj.b = 2)创建的属性,configurable默认为true -
Object.defineProperty()显式定义时,若未指定configurable,默认为false
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











