JS: Объектно-ориентированный дизайн
Теория: Прокси
В JavaScript встроен особый объект Proxy — это «полномочие действовать от имени другого лица» в переводе с английского языка. С помощью proxy-объекта можно управлять доступом к свойствам практически любых объектов. В прикладном коде такая задача встречается нечасто, хотя в библиотеках и фреймворках Proxy используется регулярно. Вот лишь некоторые примеры его использования: перегрузка некоторых операторов, мокинг объектов, передача сообщений, отслеживание изменений при управлении состоянием приложения, валидация, логирование, кеширование и многое другое.
Схема использования этого объекта выглядит так: создается объект, в конструктор которого передается два параметра (о них ниже), и дальше вся работа с исходным объектом идет через созданный объект прокси.
Первый параметр (target) — это объект, для которого нужно сделать прокси. Второй параметр (handler) – объект с обработчиками, которые перехватывают разные операции над исходным объектом (target).
Посмотрим на простой пример, в котором Proxy возвращает значение по умолчанию, если свойства не существует:
Proxy оборачивает исходный объект и перехватывает запросы к нему. Делается это с помощью обработчиков, называемых ловушками (trap). Ловушки описываются как методы объекта, который передается вторым параметром в конструктор Proxy.
Всего в Proxy 13 ловушек, среди которых самые часто используемые это "get" и "set". С помощью них перехватываются все операции чтения (get) и записи (set).
Ловушка get вызывается при каждом обращении к любому свойству объекта. На вход ей передается исходный объект и имя свойства, к которому идет обращение. Внутри же, можно строить любую логику. В нашем примере мы возвращаем значение свойства из target, если оно существует, и 0 в случае его отсутствия.
Рассмотрим теперь пример с ловушкой set:
Теперь, если присвоить значение несуществующему свойству в объекте, то будет ошибка:
Концептуально, Proxy это такая штука, которая "не отсвечивает". Прикладной код не должен знать, что он работает с Proxy, а не с исходным объектом. Только в этом случае будет обеспечиваться прозрачная работа с Proxy, то есть не придется затачивать код под него. Частично ответственность за это лежит на программисте, а частично на Proxy. Поэтому:
- У Proxy нет своих свойств, он всегда проксирует вызовы
- Из Proxy невозможно извлечь исходный объект и каким-то образом поменять его в обход ловушек
- В соответствии со спецификацией, не существует способа определить, что объект это прокси (технически такая возможность есть, но в нормальной ситуации она не должна использоваться)






