我正在尝试为某个对象创建代理,以检查是否访问或修改了属性,然后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);
原语,我认为这是问题所以我试图将它们过滤掉。有没有其他人遇到过这个问题,或者知道可能导致这个问题的原因是什么?
答案 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}}方法执行代理 已执行的确切原始行为,因此通过使用它们,您可以避免不自己正确实现它们的危险。