Reflect.isExtensible 和 Object.isExtensible 功能相同但行为不同:前者参数非对象时抛 TypeError,后者会强制转对象;前者函数式调用且与 Proxy 协同自然,后者为传统静态方法;两者返回值逻辑一致。
Reflect.isExtensible 和 Object.isExtensible 都用于判断对象是否可扩展(即能否动态添加新属性),但它们在行为细节、错误处理和设计定位上有明显差异。
当传入的不是对象类型时:
TypeError,要求参数必须是对象;Reflect 方法统一采用函数式调用形式:
Reflect.isExtensible(obj) —— 明确、可组合,适合工具函数封装或 Proxy 中复用;Object.isExtensible(obj) —— 传统静态方法,语义清晰但风格不统一(比如 obj instanceof Object 是操作符,in 是运算符)。Proxy 的每个拦截器(如 isExtensible)都对应一个 Reflect 方法,且默认行为完全一致:
isExtensible(target) { return Reflect.isExtensible(target); } 就是标准的“透传”写法;Object.isExtensible 虽然结果相同,但不符合 Reflect/Proxy 的设计契约,也不利于后续行为增强或调试。两者都返回布尔值,含义相同:
true:对象尚未被 Object.preventExtensions() 或 Reflect.preventExtensions() 锁定;false:对象不可扩展,任何新增自有属性的操作(如 obj.x = 1)将静默失败(严格模式下报错)。