Reflect.isExtensible 与 Object.isExtensible 对比

作者:袖梨 2026-07-14
Reflect.isExtensible 和 Object.isExtensible 功能相同但行为不同:前者参数非对象时抛 TypeError,后者会强制转对象;前者函数式调用且与 Proxy 协同自然,后者为传统静态方法;两者返回值逻辑一致。

Reflect.isExtensibleObject.isExtensible 都用于判断对象是否可扩展(即能否动态添加新属性),但它们在行为细节、错误处理和设计定位上有明显差异。

参数非对象时的处理方式不同

当传入的不是对象类型时:

  • Reflect.isExtensible 会直接抛出 TypeError,要求参数必须是对象;
  • Object.isExtensible 会先尝试把参数转为对象(例如字符串转成 String 实例),再进行判断,不会报错。

调用风格与函数式编程一致性

Reflect 方法统一采用函数式调用形式:

  • Reflect.isExtensible(obj) —— 明确、可组合,适合工具函数封装或 Proxy 中复用;
  • Object.isExtensible(obj) —— 传统静态方法,语义清晰但风格不统一(比如 obj instanceof Object 是操作符,in 是运算符)。

与 Proxy 的协同设计更自然

Proxy 的每个拦截器(如 isExtensible)都对应一个 Reflect 方法,且默认行为完全一致:

  • 在 Proxy handler 中写 isExtensible(target) { return Reflect.isExtensible(target); } 就是标准的“透传”写法;
  • 而用 Object.isExtensible 虽然结果相同,但不符合 Reflect/Proxy 的设计契约,也不利于后续行为增强或调试。

返回值逻辑完全一致

两者都返回布尔值,含义相同:

  • true:对象尚未被 Object.preventExtensions()Reflect.preventExtensions() 锁定;
  • false:对象不可扩展,任何新增自有属性的操作(如 obj.x = 1)将静默失败(严格模式下报错)。

相关文章

精彩推荐