configurable: false 是防止属性被删除和重配置的关键,它禁止 delete 操作及修改描述符,但允许读取和赋值(除非 writable 也为 false),且可与其他描述符组合实现精细控制。

JavaScript 中的 configurable: false 是防止对象属性被删除(delete)的关键手段,但它不止于此——它还控制该属性是否能被重新配置(如修改 writable、enumerable,或再次调用 Object.defineProperty 修改描述符)。要真正“锁定”一个属性不被删除,必须将 configurable 设为 false。
设置 configurable: false 的基本方式
使用 Object.defineProperty 或 Object.defineProperties 显式定义属性,并指定 configurable: false:
- 一旦设为
false,后续无法再通过defineProperty改回true,也无法删除该属性 -
configurable: false不影响读取或赋值(除非同时设了writable: false) - 对象本身仍可扩展(除非额外调用
Object.preventExtensions或Object.seal)
示例:
const obj = {};
Object.defineProperty(obj, 'name', {
value: 'Alice',
writable: true,
enumerable: true,
configurable: false // ? 关键:禁止删除和重配置
});
console.log(delete obj.name); // false(删除失败)
console.log(obj.name); // 'Alice'(值仍在)
configurable: false 后还能做什么?
设为 false 并不等于“完全冻结”,行为取决于其他描述符组合:
- 若
writable: true→ 可修改值:obj.name = 'Bob'✅ - 若
writable: false→ 值不可改(类似常量),但属性本身仍存在且不可删 - 若
enumerable: false→for...in和Object.keys()不会列出它,但obj.name仍可访问
注意:一旦 configurable: false,就再也不能把 writable 从 false 改成 true(反之可以,只要 configurable 还是 true)。
与 Object.seal() 和 Object.freeze() 的区别
它们都内部设 configurable: false,但作用层级不同:
-
Object.seal(obj):对所有自有属性设configurable: false,但保留writable原值 → 属性不可删、不可增删,但值可能可改 -
Object.freeze(obj):在seal基础上,进一步把所有writable设为false→ 属性不可删、不可改、不可增删 - 单独用
configurable: false更精细:只锁特定属性,不影响其他属性或对象扩展性
常见误区提醒
以下操作在 configurable: false 下会静默失败或抛错:
-
delete obj.prop→ 返回false(非报错,但无效) -
Object.defineProperty(obj, 'prop', { configurable: true })→ 抛TypeError - 试图用解构赋值 + rest 模式排除该属性(如
{name, ...rest} = obj)→name仍会被提取,因为configurable不影响读取逻辑
真正想阻止删除,核心就是确保 configurable 为 false;是否顺带限制写入或枚举,按需搭配 writable 和 enumerable 即可。

















