reflect.isextensible返回布尔值表示目标对象是否可扩展,检查其[[extensible]]内部槽位;非对象类型抛typeerror,而object.isextensible返回false;proxy中该捕获器返回值必须与目标真实状态一致。

Reflect.isExtensible 返回的是一个明确的布尔值,表示目标对象是否可扩展——也就是能否新增属性。
判断逻辑很直接
它只做一件事:检查对象内部的 [[Extensible]] 内部槽位是否为 true。这个状态由 JavaScript 引擎维护,不受 getter/setter 或原型链影响。
- 新创建的普通对象默认可扩展 → 返回
true - 调用过
Object.preventExtensions()、Object.seal()或Object.freeze()的对象 → 返回false - 非对象类型(如数字、字符串、null)传入会抛出
TypeError,不返回布尔值
和 Object.isExtensible 的关键区别
两者行为一致,但错误处理不同:
-
Object.isExtensible(123)→ 安静返回false -
Reflect.isExtensible(123)→ 立即抛出TypeError
这意味着 Reflect.isExtensible 更严格,适合需要显式错误反馈的场景,比如封装工具函数时主动拦截非法输入。
在 Proxy 中的使用约束
当配合 Proxy 使用 isExtensible 捕获器时,返回值必须与目标对象的真实可扩展性一致:
- 若
target实际可扩展,捕获器必须返回true - 若
target实际不可扩展,捕获器必须返回false
违反该不变式会触发 TypeError,这是 Proxy 的安全机制,防止代理层欺骗可扩展性检查。
常见误判点提醒
注意这些情况不会影响判断结果:
- 对象属性是否
configurable或writable—— 和可扩展性无关 - 对象是否为空或已有多少属性 —— 只看能否添加新属性
- 原型链上是否有同名属性 ——
isExtensible只检查自身对象










