Превышение максимального размера вызова стека с использованием прокси - PullRequest
0 голосов
/ 09 июня 2018

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

1 Ответ

0 голосов
/ 09 июня 2018

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

...