Reflect.isExtensible()用于检查对象是否可扩展,返回布尔值;参数非对象时抛出TypeError,与Object.isExtensible功能相同但更适配Proxy元编程场景。

Reflect.isExtensible() 是 JavaScript 中用于检查一个对象是否可扩展(即能否添加新属性)的静态方法。它返回一个布尔值:true 表示对象当前允许添加新属性,false 表示已被冻结、密封或显式设为不可扩展。
基本用法和返回逻辑
该方法接收一个参数——要检测的对象。如果传入的不是对象(如原始值),会先尝试强制转换;若转换后仍非对象(如 null 或 undefined),则抛出 TypeError。
- 对普通对象,默认返回
true - 调用
Object.preventExtensions(obj)后,返回false - 调用
Object.seal()或Object.freeze()后,也返回false(因为二者都隐式调用了preventExtensions)
与 Object.isExtensible 的区别
Reflect.isExtensible() 和 Object.isExtensible() 功能完全一致,但设计定位不同:
-
Object.isExtensible是传统工具方法,属于“对象工具类”风格 -
Reflect.isExtensible属于 Reflect API,更强调操作的“元编程”语义,与 Proxy handler 方法(如preventExtensions)一一对应,便于统一拦截和模拟 - 两者在绝大多数场景下可互换,但推荐在 Proxy 或需要语义一致性时优先用
Reflect版本
常见使用场景
主要用于运行时判断对象是否还能被动态增强,适用于配置校验、框架初始化保护、沙箱环境控制等:
- 在封装对象工厂时,提前检查输入对象是否已被锁定,避免后续赋值失败
- 配合
Proxy拦截defineProperty或set时,根据可扩展性决定是否放行 - 测试中验证
preventExtensions是否生效(比直接 try/catch 添加属性更轻量)
注意事项和陷阱
需注意几个易错点:
- 不能检测“是否已有某个属性”,只反映“是否允许新增属性”
- 对 Proxy 对象,返回值取决于其目标对象(target)的扩展性,除非 handler 显式重写了
isExtensibletrap - 不区分“不可扩展”和“不可写/不可配置”,后者需用
Object.getOwnPropertyDescriptor单独检查 - ES6+ 环境可用,IE 不支持(需 polyfill 或降级为
Object.isExtensible)


















