Почему прокси-сервер «применяет» ловушку в JS? - PullRequest
0 голосов
/ 28 апреля 2020

Proxy выглядит как API для расширения возможностей манипулирования объектами, такими как создание единого метода получения для всех свойств. Существует ловушка Proxy с именем apply , которая мешает вызову функции. Согласно документации, эту ловушку можно использовать только с функциями, поэтому эту ловушку можно реализовать с помощью простого старого JavaScript кода без прокси:

// Proxy method
const trappedFunction = new Proxy(originalFunction, {
  apply: function(target, thisArg, argumentsList) {
    console.log(thisArg, argumentsList);
    return target.apply(thisArg, argumentsList);
  }
});

// Higher order function method
var trappedFunction = function () {
  console.log(this, arguments);
  return originalFunction.apply(this, arguments);
};

Насколько я знаю, реализации выше идентичны (кроме значения arguments , которое не является массивом, но может быть легко преобразовано в массив).

Действительно ли реализации идентичны? Почему существует ловушка «применить»? Что это может дать по сравнению с простой функцией высшего порядка?

Ответы [ 2 ]

2 голосов
/ 28 апреля 2020

Действительно ли реализации идентичны?

Я не вижу никакой разницы между ними в том, что касается поведения во время выполнения, кроме различия в arguments -объектах. Лично я бы вместо этого сделал

var trappedFunction = function (...args) {
  console.log(this, args);
  originalFunction.apply(this, args);
};

, чтобы в любом случае избежать arguments.

Почему существует ловушка «применить»? Что он может дать по сравнению с простой функцией более высокого порядка?

Поскольку вы можете использовать другие ловушки одновременно. Нет способа создать функцию более высокого порядка, которая будет также прокси. Технически вы можете создать функцию более высокого порядка, а затем обернуть ее прокси-сервером, но это, как я понимаю, быстро усложнится, и тогда вы разделите свое поведение, похожее на ловушку, между обработчиком прокси и logi обтекания функций c, где apply ловушка вместе со всем остальным держит вещи в чистом виде.

Я бы также добавил, что если вы абсолютно не знаете , что вы действительно должны использовать прокси и может заставить ваш прокси вести себя так же, как и исходный объект, что намного сложнее, чем вы думаете, я бы придерживался подхода более высокого порядка.

Прокси был введен, чтобы дать нам объект возможности доступа, которые раньше были недоступны, например, один получатель для любого свойства.

Лично я бы вернул это определение sh. Proxy был введен, чтобы позволить JS коду реализовывать поведение самого объекта JS. Как побочный эффект, это означает, что код JS должен иметь возможность перехватывать доступы ко всем свойствам, даже если они не существуют, но я бы не стал называть это причиной, по которой он был введен. Подход «обработчика ловушек» уже был определен в спецификации ECMAScript, и движки JS уже имели их внутри, чтобы позволить C ++ определять поведение объекта JS для любых встроенных API-интерфейсов браузера и других вещей. Proxy предоставляет те же хуки для самого JS, чтобы позволить JS самому реализовать любой API, который вы могли бы реализовать только в C ++.

1 голос
/ 28 апреля 2020

Нет, они не идентичны. Ваш первый trappedFuncton является прокси для originalFunction, что означает, что он ведет себя точно так же, как originalFunction, за исключением его идентификации и перехваченных операций (который регистрирует аргументы и удаляет возвращаемое значение из вызовов, в вашем примере).

Второй trappedFunction - это совершенно отдельный функциональный объект, чье единственное сходство с originalFunction состоит в том, что он делает то же самое при вызове. Но trappedFunction.prototype != originalFunction.prototype и многие другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...