介绍
apply方法拦截函数调用、call和apply操作
apply方法可接受三个参数,分别是
目标对象,目标对象的上下文对象(this),目标对象的参数数组。
语法
{
var handler = {
apply(target,ctx,args) {
return Reflect.apply(...arguments);
}
}
}
demo1 下面是一个例子
{
var target = function () {
return 'I am the target';
}
var handler = {
apply: function () {
return 'I am the proxy';
}
};
var p = new Proxy(target,handler);
console.log("p",p());
}
//上面代码中,变量p是Proxy的实例,当他作为函数调用时(p())
//,就会被apply方法拦截,返回一个字符串
demo2 下面是另一个例子。
{
var twice = {
//目标对象,目标对象的上下文对象,目标对象的参数数组
apply:function (target,ctx,args) {
//return console.log("target",target,"ctx",ctx,"args",args);
return Reflect.apply(...arguments)*2;
}
};
function sum (left,right) {
return left*right;
};
var proxy = new Proxy(sum,twice);
console.log("proxy1",proxy(1,2));
console.log("proxy.call",proxy.call(null,5,6));
console.log("proxy,apply",proxy.apply(null,[7,8]));
console.log("proxy,apply",Reflect.apply(proxy,null,[7,8]));
}
//上面的实例执行顺序是当sum()执行完后再执行twice中的apply(),
//上面代码中每当执行proxy函数(直接调用或call和apply调用),就会被apply方法拦截
//另外,直接调用Reflect.apply方法,也会被拦截。
例子来源于阮一峰的es6入门,如果哪里写的不完整欢迎指正,还是萌新还望包容!