检测是从代理还是目标调用代理getter

时间:2017-05-08 23:22:41

标签: javascript ecmascript-6 es6-proxy

我使用JavaScript的Proxy对象来创建一个get()处理程序来捕获对类实例的属性访问。

我希望有不同的行为,具体取决于代理是由类中的方法调用还是由代理本身调用。

这可能吗?

编辑:一些示例代码有望解释我尝试做的事情:

class Something {
  constructor() {
    this.prop1 = 'val1';
    this.prop2 = 'val2';
  }

  getProp() {
    return this.prop1;
  }
}

const instance = new Something();

const proxiedObject = new Proxy(instance, {
  get: function(target, property, receiver) {
    if (WHATEVER_IS_ACCESSING_THIS_IS_NOT_AN_INSTANCE_METHOD) {
      return false;
    }
    else {
      return target[property];
    }
  }
});

console.log(proxiedInstance.getProp()); // 'val1'
console.log(proxiedInstance.prop1);     // 'false'

1 个答案:

答案 0 :(得分:1)

我想最简单的解决方案是bind在代理上访问它们时的所有方法,以便对this的任何访问都不会通过代理:

const proxiedObject = new Proxy(instance, {
  get: function(target, property, receiver) {
    const val = target[property];
    if (typeof val == "function") // you need this anyway for `proxiedObject.getProp()`
      return val.bind(target);
    else
      return false;
  }
});

当然,还有很多其他方法可以包装getProp方法(或任何其他方法),以便在执行期间代理对于属性访问变得透明。