reflect.construct 是 es2015 引入的反射方法,用于动态调用构造函数并显式控制 new.target;支持三参数形式 reflect.construct(target, argumentslist[, newtarget]),确保继承链中 new.target 正确,且在 proxy construct trap 中必须使用以维持原型链。

Reflect.construct 是 ES2015(ES6)引入的反射 API 方法,它能替代 new 操作符,在运行时动态选择构造函数并创建实例,同时还能指定 new.target(比如用于继承链中正确设置原型),这是普通 new Foo(...args) 无法灵活做到的。
核心用途:动态构造 + 控制 new.target
相比 new constructor(...args),Reflect.construct 的优势在于:
- 构造函数可为变量或表达式,支持完全动态决定(如从配置、字符串名、映射表中获取)
- 可显式传入
newTarget参数,确保子类继承时new.target正确指向派生类(对自定义constructor或代理类很重要) - 统一返回值行为(总是返回对象),而
new在构造函数返回对象时会覆盖默认实例
基本用法:三参数形式
语法:Reflect.construct(target, argumentsList[, newTarget])
-
target:必需,要调用的构造函数(不能是普通函数,必须有
[[Construct]]内部方法) -
argumentsList:必需,类数组或数组,作为构造参数(类似
fn.apply(this, args)) -
newTarget:可选,指定
new.target值;若不传,默认等于target
示例:
class Animal { constructor(name) { this.name = name; } }
class Dog extends Animal { constructor(name, breed) { super(name); this.breed = breed; } }
const Ctor = Math.random() > 0.5 ? Dog : Animal;
const instance = Reflect.construct(Ctor, ['Charlie', 'Golden']); // 动态选类
// instance 是 Dog 或 Animal 实例,且 new.target 正确
配合类名字符串或注册表使用
若只有类名字符串(如后端传来的类型名),需先映射到实际构造函数:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
const classRegistry = {
'User': class User { constructor(name) { this.name = name; } },
'Admin': class Admin extends User { constructor(name, level) { super(name); this.level = level; } }
};
function createInstance(className, args) {
const Ctor = classRegistry[className];
if (!Ctor) throw new Error(`Unknown class: ${className}`);
return Reflect.construct(Ctor, args);
}
const admin = createInstance('Admin', ['Alice', 99]);
注意:不推荐用 eval 或 Function.constructor 动态执行字符串生成类,存在安全与性能风险。
在 Proxy 或装饰器中控制实例化逻辑
当需要拦截或包装构造过程(如注入依赖、记录日志、校验参数),Reflect.construct 是 Proxy 的 construct trap 中必须使用的底层方法:
const handler = {
construct(target, args, newTarget) {
console.log('Creating instance of', target.name, 'with', args);
// 必须用 Reflect.construct 转发,否则无法维持 new.target 和原型链
return Reflect.construct(target, args, newTarget);
}
};
const SafeAnimal = new Proxy(Animal, handler);
const pet = new SafeAnimal('Luna'); // 触发 construct trap,并正确实例化
这里若直接写 new target(...args),会丢失 newTarget,导致继承失效。
兼容性与注意事项
Reflect.construct 在现代浏览器和 Node.js(≥ v6.0.0)中已广泛支持。使用时注意:
- 目标必须是可构造函数(
typeof ctor === 'function'且具有[[Construct]]) - 不能用于箭头函数、普通函数(无
prototype或未定义constructor) - 若
target返回原始值(如 string/number),仍返回新对象(与new行为一致) - 错误处理同
new:构造函数抛异常时,Reflect.construct也同步抛出










