reflect多数操作对不可配置属性返回false而非抛异常:deleteproperty删不可配置自有属性返回false;defineproperty改configurable为true失败;set对不可写不可配置属性赋值返回false;应先用getownpropertydescriptor探查再操作。

当目标对象的属性被设为不可配置(configurable: false)时,Reflect 的多数操作会直接失败或返回 false,而不是抛异常——这是它和 Object 方法的关键区别。
Reflect.deleteProperty 遇到不可配置属性
如果尝试删除一个不可配置的自有属性,Reflect.deleteProperty() 返回 false,不会报错。这和 delete obj.prop 在严格模式下抛 TypeError 不同。
- 属性不存在:返回 true
- 属性存在但不可配置:返回 false
- 目标不是对象(如 null、number):抛 TypeError
Reflect.defineProperty 处理不可配置属性
对已存在的不可配置属性调用 Reflect.defineProperty(),只要新描述符与原描述符冲突,就返回 false。
- 想把 writable: true 改成 false?可以(除非原属性是只读且不可配置)
- 想把 configurable: false 改成 true?不行,返回 false
- 想改 value 或 set/get?仅当 writable 或可写访问器允许时才可能成功
Reflect.set 对只读或不可配置属性的响应
Reflect.set() 在目标属性不可写且不可配置时,返回 false;若属性是 getter-only 或有 setter 但拒绝赋值,也返回 false。
- 注意:它不检查是否“可配置”,只检查是否“可写”+是否允许赋值逻辑
- 例如:
Object.defineProperty(obj, 'x', { value: 1, writable: false, configurable: false })→Reflect.set(obj, 'x', 99)返回 false - 但
Reflect.set(obj, 'y', 99)(新增属性)是否成功,取决于目标是否可扩展
如何安全判断并应对
不能只靠返回值,需结合 Reflect.getOwnPropertyDescriptor() 提前探查:
- 先用
Reflect.getOwnPropertyDescriptor(target, key)获取描述符 - 检查
configurable === false和writable === false - 再决定是否执行 delete / defineProperty / set 操作
- 避免依赖返回值做业务分支,而应主动校验约束条件











