考虑到以下对象是否可能
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 )的引用,因此失去了对结果数组的访问
我还尝试将方法代理嵌套在对象代理内。
有什么想法吗 ?
我的实际代码的 CodeSandBox https://codesandbox.io/s/frosty-kowalevski-8y4co?file=/src/index.js
// 代理的文档
代理MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy
Javascript.info/代理 https://javascript.info/proxy
// 关于代理的其他问题,但不是这个用例
了解 ES6 javascript 代理 https://stackoverflow.com/questions/48527262/understanding-es6-javascript-proxies