reflect.construct 是 es2015 引入的反射方法,用于以编程方式可控调用构造函数创建对象,接收 target、argumentslist 和可选 newtarget 参数,支持 proxy 拦截、高阶函数传递等灵活场景。

Reflect.construct 是 ES2015(ES6)引入的反射 API 方法,用于**以编程方式调用构造函数创建新对象**,功能上类似 new Constructor(...args),但更灵活、更可控,尤其适合在代理(Proxy)、装饰器或框架中动态实例化对象。
核心作用:替代 new 的可控构造调用
它接收三个参数:
- target:要调用的构造函数(必需);
- argumentsList:传给构造函数的参数数组(必需);
- newTarget(可选):指定 new.target 的值,影响 instanceof 和子类继承行为。
返回一个由 target 构造的新实例,且该实例的原型链、constructor 和 new.target 都能被精确控制。
基础用法:比 new 更规范的调用方式
普通 new 是语法操作符,无法直接作为函数传参或动态调用;而 Reflect.construct 是标准函数,支持高阶操作:
- 可作为参数传递(如
setTimeout(Reflect.construct, 0, [A, [1,2]])); - 可在 Proxy 的
construct拦截器中直接复用; - 避免
new func.apply()这类不合法写法(apply不能用于new)。
例如:
安全更新和维护 CLI Proxy API(CPA)部署与配置。用于 CPA 镜像升级、配置变更、认证目录兼容修复、上线验证与回滚。适用于用户提到“CPA 更新/升级/配置改了/容器重建/回滚”等场景。
关键细节:newTarget 参数的实际意义
当构造函数是子类时,new.target 默认指向最深的派生类。若省略 newTarget,Reflect.construct 默认使用 target 作为 new.target;但显式传入可覆盖它:
- 传入
SubClass:实例的constructor和instanceof SubClass均为 true; - 传入
ParentClass:实例仍由SubClass构造,但new.target === ParentClass,影响内部逻辑(如子类构造器中判断调用来源); - 常用于实现“伪继承”或兼容旧版类工厂模式。
典型应用场景:Proxy + construct 拦截
这是 Reflect.construct 最实用的组合——在 Proxy 中拦截构造行为,并委托给原构造函数:
construct(target, args, newTarget) {
console.log('正在创建 MyClass 实例,参数:', args);
return Reflect.construct(target, args, newTarget); // 安全转发
}
});
const inst = new proxyCtor('hello');
这样既保留了原始构造逻辑,又可插入日志、校验、装饰等逻辑,且不会破坏原型链或 instanceof 行为。










