Я пытаюсь создать прокси для определенного объекта, чтобы проверить, доступны ли свойства или изменены, а затем console.info свойство, которое было изменено. Я новичок в JavaScript, поэтому не уверен, что могло вызвать переполнение стека. Я думаю, это из-за странной проблемы с console.info, но я не уверен. Так выглядит мой обработчик
var handler = {
set: function(obj, prop, value) {
console.info(prop);
obj[prop] = value;
}
get: function(obj, prop, receiver) {
if (typeof prop !== 'symbol') console.info(prop);
return obj[receiver];
}
};
Я назначаю обработчик элементу CanvasRenderingContext2D с именем ctx, используя эту строку.
watchedCtx = new Proxy(ctx, handler);
Я добавил дополнительную проверку к методу свойства get, потому что я получал много примитивов Symbol из метода get, и я подумал, что это проблема, поэтому я попытался отфильтровать их. Кто-нибудь еще сталкивался с этой проблемой или имел какое-либо представление о том, что может быть причиной этого?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В вашем случае это опечатка obj[receiver], которая должна быть obj[prop]. receiver - это объект (обычно сам прокси), поэтому, выполняя obj[receiver], вы конвертируете receiver в строку, для чего требуются вызовы get, которые затем запускают бесконечную рекурсию, которую вы видите. Это решит вашу проблему, но, как вам сейчас может быть интересно, для чего тогда нужен receiver?
В этом случае receiver критичен для корректной работы вашего прокси. Самый простой способ справиться с этим, если вы пишете прокси, вы должны использовать методы из Reflect, чтобы гарантировать, что вы действительно правильно сохраняете поведение.
var handler = {
set: function(obj, prop, value, receiver) {
console.info(prop);
return Reflect.set(obj, prop, value, receiver);
}
get: function(obj, prop, receiver) {
if (typeof prop !== 'symbol') console.info(prop);
return Reflect.get(obj, prop, receiver);
}
};
Методы Reflect выполняют в точности то же исходное поведение, что и прокси-сервер было бы, поэтому, используя их, вы избегаете опасностей, связанных с их неправильной реализацией самостоятельно.
Это потребует дополнительных изменений в вашем коде. Я бы рекомендовал прочитать что-то вроде stackoverflow.com/questions/43927933/… Короче говоря, вы вызываете функцию из CanvasRenderingContext2D, но передаете ей прокси вместо реального холста, что вызывает ошибку, поэтому вам придется .bind или обернуть функции таким образом, чтобы им передавался правильный контекст.
Спасибо, проблема решена. Теперь получаю
TypeError: Illegal Invocation