Превышение максимального размера вызова стека с использованием прокси

Я пытаюсь создать прокси для определенного объекта, чтобы проверить, доступны ли свойства или изменены, а затем 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, и я подумал, что это проблема, поэтому я попытался отфильтровать их. Кто-нибудь еще сталкивался с этой проблемой или имел какое-либо представление о том, что может быть причиной этого?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашем случае это опечатка 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 выполняют в точности то же исходное поведение, что и прокси-сервер было бы, поэтому, используя их, вы избегаете опасностей, связанных с их неправильной реализацией самостоятельно.

Спасибо, проблема решена. Теперь получаю TypeError: Illegal Invocation

King 09.06.2018 01:07

Это потребует дополнительных изменений в вашем коде. Я бы рекомендовал прочитать что-то вроде stackoverflow.com/questions/43927933/… Короче говоря, вы вызываете функцию из CanvasRenderingContext2D, но передаете ей прокси вместо реального холста, что вызывает ошибку, поэтому вам придется .bind или обернуть функции таким образом, чтобы им передавался правильный контекст.

loganfsmyth 09.06.2018 01:11

Другие вопросы по теме