gpt4 book ai didi

javascript - 确定 Proxy 对象中的 get 处理程序是否正在处理函数调用

转载 作者:行者123 更新时间:2023-11-29 10:31:46 24 4
gpt4 key购买 nike

我目前有一个 Proxy 对象,如果属性未定义,我想捕获对它的属性调用。我的代码的基本版本应该是这样的。

var a = new Proxy({}, {
get: function(target, name, receiver) {
if (target in name) {
return target[name];
} else {
function a() {
return arguments;
}
var args = a();
return [target, name, receiver, args];
}
}
});

对此处 a 的属性调用(即:a.b; a.c() 等)应返回属性调用的目标、名称、接收者和参数。

但是,我希望解决的问题要求我知道属性调用是针对属性还是函数,以便我可以对每个应用不同的处理。检查参数对象的长度不起作用,因为调用 a.c() 会像 a.b 一样产生长度为 0,因此它会被视为普通属性并且不是方法。

因此,有没有办法确定试图访问的属性是否作为函数被调用。

更新:我应该澄清一下,如果访问的属性/方法未定义以及存在,则此方法需要工作。

最佳答案

以一种非常 hacky 的方式是可能的。如果属性为 undefined,我们将返回一个函数。如果调用了这个函数,那么我们就知道用户试图将该属性作为函数调用。如果它从来没有,它被称为一个属性。为了检查函数是否被调用,我们利用了 Promise 的回调在事件循环的下一次迭代中被调用这一事实。这意味着我们要等到稍后才能知道它是否是一个属性,因为用户需要有机会先调用该函数(因为我们的代码是一个 getter)。

此方法的一个缺点是,如果用户需要一个属性,则从对象返回的值将是新函数,而不是 undefined。如果您立即需要结果并且不能等到下一次事件循环迭代,这也不适合您。

const obj = {
func: undefined,
realFunc: () => "Real Func Called",
prop: undefined,
realProp: true
};

const handlers = {
get: (target, name) => {
const prop = target[name];
if (prop != null) { return prop; }

let isProp = true;
Promise.resolve().then(() => {
if (isProp) {
console.log(`Undefined ${name} is Prop`)
} else {
console.log(`Undefined ${name} is Func`);
}
});
return new Proxy(()=>{}, {
get: handlers.get,
apply: () => {
isProp = false;
return new Proxy(()=>{}, handlers);
}
});
}
};

const proxied = new Proxy(obj, handlers);

let res = proxied.func();
res = proxied.func;
res = proxied.prop;
res = proxied.realFunc();
console.log(`realFunc: ${res}`);
res = proxied.realProp;
console.log(`realProp: ${res}`);
proxied.propC1.funcC2().propC3.funcC4().funcC5();

关于javascript - 确定 Proxy 对象中的 get 处理程序是否正在处理函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44441259/

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