Паттерн Proxy (Прокси), туториал: кеширование функции с Proxy

Подробнее разберём пример с «проксированием» функции (функция — это тоже объект в JS). В случае функций через Proxy можно перехватывать момент вызова функции (перехватчик apply) и, например, манипулировать аргументами до вызова.

const func = () => {};
const proxyFunc = new Proxy(func, {
apply: (func, _, args) => {
// перехватчик вызова
console.log(`Вызвана функция ${func} с параметрами ${args}`);
},
});
proxyFunc(1, 2);
// Вызвана функция () => {} с параметрами 1,2

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

Аргументами функции, то есть и ключами в кеше, могут быть не только примитивы, но и объекты, за счёт того, что ключ формируется с помощью JSON.stringify.

Таким образом, с помощью Proxy можно на коленке собрать «мидлвари» для объектов, массивов и функций, в общем-то, с любыми целями.