gpt4 book ai didi

javascript - 如何创建一个包罗万象的对象代理?

转载 作者:行者123 更新时间:2023-11-30 20:16:24 25 4
gpt4 key购买 nike

我想创建一个代理对象来拦截所有属性检索和函数调用,并返回 undefined

完成前者是微不足道的:

const proxy = new Proxy({}, { get: () => undefined });
proxy.foo // undefined

事实上,我什至不需要为此使用代理,一个空对象 ({}) 也可以做到这一点。但是,对函数调用执行相同操作会引发错误:

proxy.foo() // TypeError: proxy.foo is not a function

我可以让 get 陷阱返回一个函数:

const proxy = new Proxy({}, { get: () => () => undefined });
proxy.foo() // undefined
proxy.foo // [Function]

但如您所见,对于我的原始属性访问情况,它将返回一个函数而不是 undefined。是否可以实现我想要的?

const proxy = ???;
proxy.foo; // undefined
proxy.foo(); // undefined

最终目标是将其用作测试的“万能” stub 。

更新:感谢@Bergi 的回答。下面的代码完成了我想要的:

const proxy = new Proxy(new Function, {
get: (target, prop, receiver) => receiver,
});

console.log('proxy.foo', proxy.foo); // undefined
console.log('proxy.foo()', proxy.foo()); // undefined
console.log('proxy.foo.bar', proxy.foo.bar); // undefined
console.log('proxy.foo.bar()', proxy.foo.bar()); // undefined

最佳答案

不,这是不可能的。代理不会拦截方法 调用,它只能拦截对代理本身的调用(如在proxy() 中)。方法调用只是属性访问,然后是对属性值的函数调用。并且不可能有一个既是 undefined 又是函数的值。

要拥有一个真正包罗万象的测试 stub ,您的代理应该为任何访问或调用返回自己(或更好的另一个代理),以便您可以拥有任意链。

关于javascript - 如何创建一个包罗万象的对象代理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51880346/

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