reflect.isextensible 是纯查询操作,不抛错、无副作用,严格模式下安全可靠;与 object.isextensible 不同,它对 null/undefined/原始值返回 false,且行为更稳健,适配条件判断与 proxy 拦截。

Reflect.isExtensible 在严格模式下本身就是安全的检测方法——它不会触发任何运行时异常,也不会修改对象状态,只返回布尔值。
为什么它天然适合严格模式
不同于 Object.setPrototypeOf 或直接赋值 obj.__proto__,Reflect.isExtensible 是一个纯查询操作:
- 无论目标是否为 null、undefined 或原始值,它都返回
false(不抛错) - 对已冻结、密封或不可扩展的对象,它准确返回
false,且无副作用 - 不依赖对象是否可写、可配置,只读取内部 [[Extensible]] 标志
与 Object.isExtensible 的关键区别
两者功能一致,但行为更稳健:
-
Object.isExtensible(null)在 ES5 中会抛TypeError;而Reflect.isExtensible(null)稳定返回false -
Reflect方法统一遵循“失败即返回 false”原则,适配条件判断逻辑 - 在 Proxy 拦截中,
Reflect.isExtensible可被isExtensible陷阱捕获,便于沙箱控制
典型安全用法示例
可用于防御性检查,避免后续危险操作:
- 在调用
Object.setPrototypeOf前先确认:if (Reflect.isExtensible(obj)) { Object.setPrototypeOf(obj, newProto); } - 微前端沙箱中定期校验共享对象:
if (!Reflect.isExtensible(window)) { console.warn('全局对象已被锁定'); } - 配合 Proxy 实现细粒度控制:
new Proxy(obj, { isExtensible() { return Reflect.isExtensible(obj); } })
注意边界情况
它检测的是对象本身的可扩展性,不是原型链上的可扩展性:
- 即使
obj不可扩展,obj.__proto__仍可能可扩展——需单独检测 - 它不反映属性是否可写/可配置,仅回答“能否添加新属性”这一问题
- 对 Proxy 对象,结果取决于其
isExtensible陷阱的实现,而非目标对象











