使用Proxies超过最大堆栈调用大小

时间:2018-06-08 22:56:04

标签: javascript debugging ecmascript-6 stack proxies

我正在尝试为某个对象创建代理,以检查是否访问或修改了属性,然后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的{​​{1}}元素。

ctx

我在get属性方法中添加了额外的检查,因为我从get方法接收了很多 watchedCtx = new Proxy(ctx, handler); 原语,我认为这是问题所以我试图将它们过滤掉。有没有其他人遇到过这个问题,或者知道可能导致这个问题的原因是什么?

1 个答案:

答案 0 :(得分:1)

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

在这种情况下,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

{{1}}方法执行代理 已执行的确切原始行为,因此通过使用它们,您可以避免不自己正确实现它们的危险。