0

我正在尝试为某个对象创建代理,以检查属性是否被访问或修改,然后console.log是被更改的属性。我对 JavaScript 还很陌生,所以我不确定是什么导致堆栈溢出。我认为这是由于一个奇怪的范围问题,console.log但我不确定。这就是我的处理程序的样子

var handler = {
    set: function(obj, prop, value) {
         console.log(prop);
         obj[prop] = value;
    }
    get: function(obj, prop, receiver) {
          if (typeof prop !== 'symbol') console.log(prop);
          return obj[receiver];
    }
};

我将处理程序分配给使用此行CanvasRenderingContext2D命名的元素。ctx

 watchedCtx = new Proxy(ctx, handler);

我在 get 属性方法中添加了额外的检查,因为我从 get 方法收到了很多Symbol原语,我认为这是问题所在,所以我试图将它们过滤掉。有没有其他人遇到过这个问题或知道是什么原因造成的?

4

1 回答 1

1

在您的情况下,错字是obj[receiver],应该是obj[prop]receiver是一个对象(通常是您的代理本身),因此通过执行obj[receiver],您将转换receiver为字符串,这需要调用get,然后触发您所看到的无限递归。这将解决您的问题,但是您现在可能想知道,那有什么receiver用呢?

在这种情况下,receiver对于代理的正确运行至关重要。如果您正在编写代理,最简单的处理方法是使用 from 的方法Reflect来确保您实际上正确地保留了行为。

var handler = {
  set: function(obj, prop, value, receiver) {
    console.log(prop);

    return Reflect.set(obj, prop, value, receiver);
  }
  get: function(obj, prop, receiver) {
    if (typeof prop !== 'symbol') console.log(prop);

    return Reflect.get(obj, prop, receiver);
  }
};

这些方法执行代理Reflect执行的确切原始行为,因此通过使用它们,您可以避免自己没有正确实现它们的危险。

于 2018-06-08T23:02:50.830 回答