对apply运用的理解
根据看到的案例得出的结论,当使用apply拦截的时候,target应该是一个函数,而且生成的proxy实例应该以函数的方式调用
let mark = {name: 'kf', book: 'vue'}
let target = {a: 'a', b:'b'}; // 因为不是函数,会导致报错
let hander = {
apply(target,ctx,args) {
console.log(target,ctx,args)
return 'I am the proxy'
}
}
let p = new Proxy(target,hander)
console.log(p(age=8,sex='男'))
console.log(p.call(mark,age=8,sex='男'))
console.log(p.apply(mark,[age=8,sex='男']))
报错:Uncaught TypeError: p is not a function
参数说明
// apply方法拦截函数的调用、call和apply操作。
// apply方法可以接受三个参数,分别是目标对象、目标对象的上下文对象(this)和目标对象的参数数组。
let handler = {
apply (target,ctx,args) {
return Reflect.applay(...arguments)
}
}
demo1:
let target = function(name="kate") {return 'I am the target' };
let hander = {
apply(target,ctx,args) {
console.log(target,ctx,args)
return 'I am the proxy'
}
}
let p = new Proxy(target,hander)
console.log(p())
打印结果:
demo2:
let target = function(name="kate") {return 'I am the target' };
let hander = {
apply(target,ctx,args) {
console.log(target,ctx,args)
return 'I am the proxy'
}
}
let p = new Proxy(target,hander)
console.log(p(age=8,sex='男'))
demo3
let mark = {name: 'kf', book: 'vue'}
let target = function(name="kate") {return 'I am the target' };
let hander = {
apply(target,ctx,args) {
console.log(target,ctx,args)
return 'I am the proxy'
}
}
let p = new Proxy(target,hander)
console.log(p.call(mark,age=8,sex='男'))
console.log(p.apply(mark,[age=8,sex='男']))