var twice = {
apply (target, ctx, args) {
return Reflect.apply(...arguments) * 2;
}
};
function sum (left, right) {
return left + right;
};
var proxy = new Proxy(sum, twice);
console.log(proxy(1, 2))
apply方法拦截函数的调用、call和apply操作。
想了蛮久,始终没懂执行流程。
拦截器中的
Reflect.apply
应该相当于调用sum.bind(ctx)
。ctx
是调用时的上下文对象,这里是undefined
这样你调用
proxy(1,2)
的返回值就相当于,Reflect.apply(...arguments)*2
,也就是sum.bind(undefined)(1,2)
。阮大大有写到:
我个人理解是,本来你能直接达到目标(直接调用
sum
),而现在你想访问对象会经过一个拦截层,你可以在调用前修改参数,也可以在调用后修改返回值(比如本例的*2
)。拦截器类似元编程,相当于
修改语言特性的语法
,比如本例就是对函数的apply
机制进行修改,其他代理如get
、set
等相当于对对象的读写特性进行了修改,表面上看就好像语言特性被修改了。看下这两个例子应该就能明白如何用
Proxy
来代理一个函数: