【问题标题】:How to create a catch-all object proxy?如何创建一个包罗万象的对象代理?
【发布时间】:2018-08-16 15:14:08
【问题描述】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      只是为了实现你想要的,你可以这样做。

      var obj = {
          foo: 1,
          bar: 2,
          fooFunc: () => {
              return "this is fooFunc";
          },
          barFunc: () => {
              return "this is barFunc";
          }
      }
      
      let Proxy = function (object) {
      
          for(var prop in object) {
              if(typeof object[prop] === 'function') {
                  this[prop] = () => {
                      return undefined;
                  }
              }
              else {
                  this[prop] = undefined;
              }
          }
      }
      
      let proxy = new Proxy(obj);
      
      console.log(obj.foo);
      console.log(proxy.foo);
      
      console.log(obj.fooFunc());
      console.log(proxy.fooFunc());
      

      这对于自定义存根方法并不理想,但我想这适用于您的情况。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-22
        • 1970-01-01
        • 2016-04-22
        相关资源
        最近更新 更多