当属性的 configurable 为 false 时,该属性无法被 delete 操作删除;非严格模式下 delete 返回 false,严格模式下抛出 typeerror,且该限制仅适用于自有属性。

当属性的 configurable 为 false 时,该属性无法被 delete 操作删除。
configurable: false 阻止 delete 成功执行
JavaScript 中,对象属性的 configurable 特性控制该属性是否可被删除、是否可修改其描述符(如 writable、enumerable)。一旦设为 false,delete 操作会静默失败(在非严格模式下返回 false),严格模式下则抛出 TypeError。
- 非严格模式:
delete obj.prop返回false,属性仍存在 - 严格模式:执行
delete obj.prop会立即抛出TypeError: Cannot delete property 'prop' of #<object></object> - 该限制仅作用于自有属性;继承来的不可配置属性本就不能被 delete(本来就不存在于当前对象)
哪些操作会让 configurable 变为 false
以下方式定义或修改属性时,默认或显式设置 configurable: false:
-
Object.defineProperty(obj, 'x', { value: 1 })—— 不传configurable时默认为false -
Object.freeze(obj)或Object.seal(obj)会使所有自有属性的configurable变为false - 类中定义的实例方法(如
class C { m(){} })和原型上的方法,其configurable默认为false
如何检查属性是否可删除
可通过 Object.getOwnPropertyDescriptor 查看属性描述符:
-
Object.getOwnPropertyDescriptor(obj, 'prop')?.configurable === false表示不可删除 - 注意:
in操作符或hasOwnProperty只能判断属性是否存在,不能反映configurable状态 - 尝试
delete并检查返回值(非严格模式)或捕获异常(严格模式)是运行时验证方式
不可删除不等于不可修改
configurable: false 不影响 writable 和 value(只要 writable: true,仍可赋值):
-
obj.x = 2仍可能成功(取决于writable) - 但不能再用
Object.defineProperty修改configurable、enumerable或把data属性转成accessor - 也不能通过
delete移除该属性
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











