reflect.construct 的参数处理机制将实例创建拆解为三要素:target 必须是可 new 的函数,argumentslist 必须是类数组,newtarget 可选但决定原型链和 new.target 值;所有校验即时抛错。

Reflect.construct 的参数处理机制是它区别于 new 的关键所在——不是简单“调用构造函数”,而是把实例创建过程拆解为可编程的三要素:谁来造、传什么、以谁的身份造。
target:必须是真正的构造函数
第一个参数 target 必须是可被 new 调用的函数(包括 class、普通函数、内置类如 Date 或 Array)。如果传入普通对象、null、字符串或箭头函数,会直接抛出 TypeError。
- ✅ 合法:
Reflect.construct(Date, [2026, 6])、Reflect.construct(MyClass, ['a', 'b']) - ❌ 非法:
Reflect.construct({}, [])、Reflect.construct(() => {}, [])
argumentsList:必须是类数组,但支持动态拼接
第二个参数 argumentsList 是一个类数组对象(如数组、arguments、TypedArray),不能是普通对象或字符串。它会被展开为构造函数的实际参数,等价于 ...args。
- 支持运行时组装:
const args = ['name', 42]; Reflect.construct(Person, args) - 可嵌套组合:
Reflect.construct(Widget, [...baseConfig, { debug: true }]) - 空参数也需显式传空数组:
Reflect.construct(EmptyClass, []),不能省略或传undefined
newTarget:可选但决定原型链和 new.target 语义
第三个参数 newTarget 是可选的,但它不是“备用构造器”,而是用于指定新实例的 [[Prototype]] 起点,并影响构造函数内部 new.target 的值。
- 省略时,默认等于
target,行为与new target(...)完全一致 - 传入子类时,实例的
__proto__指向newTarget.prototype,且new.target在构造函数内返回该子类 - 常用于继承内置类:
Reflect.construct(Array, [1, 2], MyArray)让Array内部看到new.target === MyArray
参数校验发生在调用时,不延迟也不静默
所有参数合法性检查都在 Reflect.construct 执行瞬间完成:
-
target不是构造函数 → 抛TypeError -
argumentsList不可迭代(如null)→ 抛TypeError -
newTarget存在但不是函数 → 抛TypeError - 构造函数内部抛错(如参数校验失败)→ 错误原样向上冒泡,不会被封装











