首页 > 解决方案 > 如何创建一个包罗万象的对象代理?

问题描述

我想创建一个代理对象来拦截所有属性检索和函数调用,并返回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

最终目标是将其用作测试的“包罗万象”存根。

更新: 感谢@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

标签: javascript

解决方案


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

为了有一个真正的包罗万象的存根进行测试,你的代理应该为任何访问或调用返回自己(或者更好的是另一个代理),这样你就可以拥有任意链。


推荐阅读