Действительно ли реализации идентичны?
Я не вижу никакой разницы между ними в том, что касается поведения во время выполнения, кроме различия в 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 ++.