【发布时间】:2020-04-29 04:57:57
【问题描述】:
有没有可能,给定以下对象
let target = {
foo:0,
result:[],
bar(){
//some code
}
}
然后将所述对象包装在 Proxy()
let handler = {
get(){
// code here
},
apply(){
// code here
}
}
target = new Proxy(target,handler);
捕捉到bar() 的调用并将结果保存到results:[] ?
我试了几次
let target = {
called:0,
results:[],
foo(bar){
return bar;
},
}
let handler = {
get(target,prop){
console.log('Get Ran')
return target[prop];
},
apply(target,thisArg,args){
console.log('Apply Ran')
// never runs
}
}
target = new Proxy(target,handler);
target.foo();
这段代码错过了 [[ apply ]] 但捕获了 [[ get ]] (如果内存服务,对象方法调用作为两个操作完成,[[ get ]] [[ apply ]])
let target = {
called:0,
results:[],
foo(bar){
return bar;
},
}
let handler = {
get(target,prop){
return target[prop];
},
apply(target,thisArg,args){
let product = target.apply(thisArg,args)
return product;
},
}
let prox = new Proxy(target.foo,handler);
console.log(prox('hello'));
如果我将对象方法包装在代理中,它会捕获 [[ apply ]] 但我失去了对原始对象( this )的引用,因此无法访问结果数组
我还尝试将方法代理嵌套在对象代理中。
有什么想法吗?
// 代理文档
// 其他问题,关于代理,但不是这个用例
【问题讨论】:
-
看起来你的目标没有引用它自己的任何属性。那么它真的需要绑定到
this吗?此外,除非您使用代理版本,否则您将无法监听函数调用。为什么不通过将函数包装在函数中来添加您想要的额外功能?您能否举一个代码框示例来说明您要实现的目标? -
@DanielDuong 是的!我完全做了一个,但忽略了将它添加到我的原始帖子中回答你的问题,作为一个有趣的副项目,我正在制作一个 Jest 的仿冒版本,以便更直观地理解它,这是专门为模拟功能,模拟函数存储有关其调用方式,调用结果的详细信息等......所以这就是我来自的地方
标签: javascript ecmascript-6 proxy