gpt4 book ai didi

javascript - 在代理处理程序中,如何区分获取属性 (var) 与调用方法?

转载 作者:行者123 更新时间:2023-11-30 14:38:41 25 4
gpt4 key购买 nike

我有以下代码,我在其中使用代理对象(代理)来 try catch 方法调用和属性访问:

示例:https://jsfiddle.net/r8j4fzxL/2/

(function() {
'use strict';
console.clear();

//some empty class where I want to trap methods props
class X {
//...
}

let proxy = {
get: function(target, prop, receiver) {

console.log('get called: ',
'target:', target,
'prop:', prop,
'receiver:', receiver
);
//this is OK, if we are called as a method.
//but it isn't when called as .prop - because, obviously, we return a function here.
return function(...args) {
console.log('wrapper args:', args);
return 42;
}
},


};


let p1 = new Proxy(X, proxy);
//how to distinguish the two in the above proxy:
console.log(p1.test('some arg passed'));
console.log(p1.test);
})();

这里我有两个问题。

  1. 一般来说,如果我想捕获属性访问和方法访问,这是正确的方法吗?或者也许我应该以某种方式使用 .apply trap(虽然没有这样做)?

  2. 如果这是正确的方式(使用 .get)- 那么我怎么知道用户是如何访问...东西的?通过 .foo; 或通过 .foo();?

我使用过但显然没有完全理解的资源:

所以:JavaScript Equivalent Of PHP __call

最佳答案

这实际上是这个问题的解决方案(被标记为重复但不是!!):How to get function arguments in a Proxy handler

你不能在“get”陷阱中获取参数,因为当调用 get 陷阱时,函数还没有被调用!
但是您可以使用“应用”陷阱创建另一个代理,示例如下:

(function() {
'use strict';
console.clear();

//some empty class where I want to trap methods & props
class X {

}

let proxy = {
get: function(target, prop, receiver) {
console.log(arguments);//this gives the arguments of the 'get' trap itself.


// normally you trap an existent funcion, in this example we are creating a new one here
var F = function(...args){
console.log('Original function call', args);
}

return new Proxy(F, {
apply: function(target, thisArg, argumentsList) {
// here you have the arguments
console.log('Trapped function call', argumentsList);
return target.apply(thisArg, argumentsList);
}});

},


};


let p = new Proxy(X, proxy);
console.log(p.test('some arg passed'));

})();

所以诀窍是首先用 get 捕获函数,而不是返回原始函数,返回一个 Proxy 并将陷阱应用到原始函数。

关于javascript - 在代理处理程序中,如何区分获取属性 (var) 与调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50027225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com