当 configurable 为 false 时,delete 删除属性、用 object.defineproperty 修改 configurable/enumerable、或变更属性类型(数据↔访问器)均会抛出 typeerror,严格与非严格模式下均如此。

当 JavaScript 中属性的 configurable 为 false 时,该属性无法被删除,也不能被重新配置(比如修改 writable、enumerable、configurable 自身,或从数据属性转为访问器属性等)。若强行操作,会抛出 TypeError——但在非严格模式下,某些操作可能静默失败,容易埋下隐患。
哪些操作会触发 TypeError?
以下操作在 configurable: false 时一定会抛出错误(严格/非严格模式均如此):
- 使用
delete删除该属性(例如delete obj.prop) - 用
Object.defineProperty()修改configurable、enumerable或将数据属性改为访问器属性 - 用
Object.defineProperty()将访问器属性改为数据属性(即使只改value或writable,只要底层 descriptor 类型变更就报错) - 重复调用
Object.defineProperty()尝试把configurable: false改成true
哪些操作看似“安全”但有陷阱?
部分操作在非严格模式下不报错,却无实际效果,易被误判为成功:
-
obj.prop = newValue:如果属性是writable: true,赋值成功;若writable: false,非严格模式静默忽略,严格模式报TypeError -
Object.defineProperty(obj, 'prop', { writable: false }):若原属性已是writable: false,不报错;但若尝试设为true,且configurable: false,则报错 -
for...in或Object.keys()是否包含该属性,只取决于enumerable,与configurable无关——但开发者常误以为“不可配置=不可枚举”
如何安全地检测和处理?
推荐在关键逻辑前主动检查属性可配置性,避免运行时崩溃:
- 用
Object.getOwnPropertyDescriptor(obj, key)获取描述符,判断configurable === false - 对可能被冻结的对象(如
Object.freeze()后的结果),默认按configurable: false处理 - 封装定义逻辑,捕获并提示明确错误信息,例如:
try {
Object.defineProperty(obj, 'x', { configurable: true });
} catch (e) {
if (e instanceof TypeError && /configurable/i.test(e.message)) {
console.warn('属性 x 不可重新配置,跳过修改');
}
}
常见修复思路
一旦遇到 configurable: false 导致的错误,需根据场景选择策略:
- 若控制对象创建过程:避免提前设
configurable: false,或仅在真正需要防篡改时使用 - 若处理第三方库返回的对象(如 React 的 props、Vue 的响应式对象):不要尝试重定义其属性,改用代理(
Proxy)或包装对象 - 若需模拟“可配置”行为:用闭包或 WeakMap 存储动态值,而非直接修改原属性描述符
- 测试时启用严格模式(
"use strict"),让静默失败的操作尽早暴露
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











