reflect.construct() 是安全转发构造调用的核心方法,它精确复现原生构造行为,自动绑定 new.target、保持原型链,并支持子类继承;construct 捕获器必须返回对象,否则抛 typeerror。

Reflect.construct() 是动态代理中拦截类实例化的关键工具,它让 Proxy 的 construct 捕获器能正确、安全地完成对象构造,同时保持原型链和 new.target 语义。
construct 捕获器必须返回一个对象
当使用 new 调用被代理的构造函数时,construct(target, args, newTarget) 会被触发。这个捕获器必须返回一个对象,否则会抛出 TypeError。直接 return new target(...args) 可能破坏 new.target 或原型继承(尤其涉及派生类时)。
正确做法是委托给 Reflect.construct():
macOS 微信消息自动化工具。通过 GUI 自动化实现:发送消息给指定联系人、读取聊天内容、监控新消息。适用于需要自动化微信操作的场景,如定时发送、批量回复、消息备份等。依赖 peekaboo 进行屏幕截图和 UI 交互。仅支持 macOS。开源地址:https://github.com/chairmanmia...
-
Reflect.construct(target, args, newTarget)精确复现原生构造行为 - 自动绑定
new.target(对 extends 链至关重要) - 确保返回实例的
[[Prototype]]正确指向target.prototype
Reflect.construct 是安全的“构造转发”方式
对比手动 new target(...args),Reflect.construct 更可靠:
- 支持子类调用:若
newTarget !== target(比如class B extends A中new B()),Reflect.construct会把newTarget传入内部构造逻辑,保证子类的constructor和super()正常工作 - 不丢失元信息:保留对
new.target的访问,类内可通过new.target判断实际构造者 - 避免 this 绑定错误:无需手动处理
target.apply或call,规避非构造上下文问题
典型配合 Proxy 的使用模式
以下是一个拦截实例化并注入日志的完整示例:
class Person {
constructor(name) {
this.name = name;
}
}
const proxiedPerson = new Proxy(Person, {
construct(target, args, newTarget) {
console.log(`正在用参数 [${args}] 构造 ${newTarget.name}`);
// ✅ 正确转发:保留 new.target 语义
const instance = Reflect.construct(target, args, newTarget);
// 可在此对 instance 做增强(如添加时间戳)
instance.createdAt = Date.now();
return instance;
}
});
const p = new proxiedPerson("Alice"); // 输出日志,p.createdAt 存在
console.log(p instanceof Person); // true
注意边界情况
使用时需留意几点:
-
target必须是可构造函数(typeof target === 'function'且有[[Construct]]内部方法),否则Reflect.construct报错 - 不能省略
newTarget参数:即使不修改,也应原样传入,否则子类继承链断裂 - 若想完全替换构造逻辑(如返回缓存实例或不同类的实例),仍可返回任意对象,但需自行确保其行为符合预期(例如手动设置
__proto__或用Object.setPrototypeOf)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










