Reflect.construct 的核心价值在于补足 extends 的能力缺口,支持继承 Proxy 类、内置类(Array/ Error)及非标准类,并精确控制 new.target 与原型链。
用 reflect.construct 模拟现代类继承,核心不是“替代 extends”,而是补足 extends 在特定场景下的能力缺口——比如继承第三方非标准类、内置类(error、array)、被 proxy 包裹的类,或需要精确控制 new.target 语义的场合。它让继承从“语法约定”升级为“可编程过程”。
绕过 new 的隐式限制,接管实例创建权
普通 extends 中的 super() 是黑盒调用:它自动创建父类实例、绑定原型、传递 new.target,但无法干预中间逻辑。而 Reflect.construct 把这整个过程暴露出来:
- 第一个参数
target明确指定调用哪个构造函数 - 第二个参数
argumentsList以数组形式传参,天然支持动态参数拼接(如[...baseArgs, ...extra]) - 第三个参数
newTarget是关键——它决定新对象的[[Prototype]]链起点,也决定父类内部new.target的值
修复被 Proxy 干扰的原型链
当子类继承一个被 Proxy 包裹的基类时,super() 会落入 construct 陷阱。若陷阱里写 new _class(args),返回的对象原型是 _class.prototype,而非子类原型,导致 instanceof 失败、方法查找中断。
正确做法是在陷阱中使用:
construct(_class, args, constructor) {
return Reflect.construct(_class, args, constructor);
}
这样既保留了代理逻辑,又确保返回对象的原型链正确指向 constructor.prototype(即子类原型)。
继承内置类与非标准第三方类
原生类(如 Array、Error)和某些 UI 库类常有以下行为:
- 检查
new.target === Array才执行初始化,否则返回普通对象 - 构造函数内直接
return Object.assign(Object.create(SomeProto), data) - 依赖闭包私有状态,仅在
new X()时触发绑定
此时 class MyArray extends Array 会失败,因为 super() 无法满足其 new.target 校验。而:
class MyArray {
constructor(...args) {
const instance = Reflect.construct(Array, args, new.target);
instance.customFlag = true;
return instance;
}
}
能精准复现 new MyArray() 的上下文,让 Array 内部认为自己正被 MyArray 构造。
手动组装 this,实现寄生组合式继承
对那些构造后返回独立对象的类(如某些老版 Babel 编译类),不能只靠 Reflect.construct 返回值,还需把状态“迁移”到当前 this:
- 先用
Object.setPrototypeOf(this, new.target.prototype)确保this原型正确 - 再调用
Reflect.construct(Parent, args, new.target)获取父类初始化后的实例 - 用
Object.assign(this, parentInstance)或逐个复制自有属性 - 显式调用
parentInstance.init?.call(this)补全生命周期钩子

















