Proxy.apply专门拦截函数调用,要求target必须是函数,接收target、thisArg和argumentsList三参数,返回值即为函数调用结果;仅适用于普通调用(fn()),不处理new调用。

JavaScript 中 Proxy 可以通过 apply 拦截器捕获函数被调用(即使用 () 执行)的过程,前提是该函数是被 Proxy 包裹的函数对象(即 target 是函数)。
apply 拦截器的基本用法
apply 是 Proxy 的一个可选 trap,当被代理的目标对象是函数、且该函数被作为普通函数调用(非构造调用)时触发。它接收三个参数:
- target:原函数(必须是函数)
-
thisArg:调用时的
this值 -
argumentsList:调用时传入的实参数组(类数组,如
[1, 'a'])
你需要返回一个值,这个值会成为函数调用的最终返回结果。
必须确保 target 是函数
apply 只在 Proxy 的 target 是函数时才有效。如果 target 不是函数,即使设置了 apply,调用时也会直接报错 TypeError: xxx is not a function。
✅ 正确示例:
const originalFn = (x, y) => x + y;
const proxyFn = new Proxy(originalFn, {
apply(target, thisArg, args) {
console.log('函数被调用,参数:', args); // [2, 3]
console.log('this 值:', thisArg); // undefined(普通调用)
return Reflect.apply(target, thisArg, args) * 2;
}
});
proxyFn(2, 3); // 输出日志,返回 10
注意 this 和 new 调用的区别
apply 仅拦截 普通函数调用(fn()),不拦截 构造调用(new fn())。后者由 construct 拦截器处理。
如果想同时控制两种调用方式,需同时定义 apply 和 construct。
另外,thisArg 是实际传入的 this(比如 obj.fn() 中的 obj),但若函数是箭头函数或严格模式下普通函数未显式绑定,thisArg 可能为 undefined 或全局对象(非严格模式)。
常见用途与建议
- 参数预处理:在执行前校验、转换或记录参数
- 调用日志与性能监控:统计调用次数、耗时等
- 权限/条件拦截:根据上下文决定是否放行调用(如返回默认值或抛错)
-
避免直接调用原函数:用
Reflect.apply保证语义一致;若需自定义逻辑,也可完全绕过原函数
不复杂但容易忽略:Proxy 对函数的拦截只发生在“被调用”那一刻,而非定义或赋值时。只要确保目标是函数、正确设置 apply、并用 Proxy 实例代替原函数使用,就能稳定生效。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











