HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-02-26
1 <p>В JavaScript встроен особый объект Proxy - это "полномочие действовать от имени другого лица" в переводе с английского языка. С помощью proxy-объекта можно управлять доступом к свойствам практически любых объектов. В прикладном коде такая задача встречается нечасто, хотя в библиотеках и фреймворках Proxy используется регулярно. Вот лишь некоторые примеры его использования: перегрузка некоторых операторов, мокинг объектов, передача сообщений, отслеживание изменений при управлении состоянием приложения, валидация, логирование, кеширование и многое другое.</p>
1 <p>В JavaScript встроен особый объект Proxy - это "полномочие действовать от имени другого лица" в переводе с английского языка. С помощью proxy-объекта можно управлять доступом к свойствам практически любых объектов. В прикладном коде такая задача встречается нечасто, хотя в библиотеках и фреймворках Proxy используется регулярно. Вот лишь некоторые примеры его использования: перегрузка некоторых операторов, мокинг объектов, передача сообщений, отслеживание изменений при управлении состоянием приложения, валидация, логирование, кеширование и многое другое.</p>
2 <p>Схема использования этого объекта выглядит так: создается объект, в конструктор которого передается два параметра (о них ниже), и дальше вся работа с исходным объектом идет через созданный объект прокси.</p>
2 <p>Схема использования этого объекта выглядит так: создается объект, в конструктор которого передается два параметра (о них ниже), и дальше вся работа с исходным объектом идет через созданный объект прокси.</p>
3 <p>Первый параметр (target) - это объект, для которого нужно сделать прокси. Второй параметр (handler) - объект с обработчиками, которые перехватывают разные операции над исходным объектом (target).</p>
3 <p>Первый параметр (target) - это объект, для которого нужно сделать прокси. Второй параметр (handler) - объект с обработчиками, которые перехватывают разные операции над исходным объектом (target).</p>
4 <p>Посмотрим на простой пример, в котором Proxy возвращает значение по умолчанию, если свойства не существует:</p>
4 <p>Посмотрим на простой пример, в котором Proxy возвращает значение по умолчанию, если свойства не существует:</p>
5 <p>Proxy оборачивает исходный объект и перехватывает запросы к нему. Делается это с помощью обработчиков, называемых ловушками (trap). Ловушки описываются как методы объекта, который передается вторым параметром в конструктор Proxy.</p>
5 <p>Proxy оборачивает исходный объект и перехватывает запросы к нему. Делается это с помощью обработчиков, называемых ловушками (trap). Ловушки описываются как методы объекта, который передается вторым параметром в конструктор Proxy.</p>
6 <p>Всего в Proxy 13 ловушек, среди которых самые часто используемые это "get" и "set". С помощью них перехватываются все операции чтения (get) и записи (set).</p>
6 <p>Всего в Proxy 13 ловушек, среди которых самые часто используемые это "get" и "set". С помощью них перехватываются все операции чтения (get) и записи (set).</p>
7 <p>Ловушка<strong>get</strong>вызывается при каждом обращении к любому свойству объекта. На вход ей передается исходный объект и имя свойства, к которому идет обращение. Внутри же, можно строить любую логику. В нашем примере мы возвращаем значение свойства из target, если оно существует, и 0 в случае его отсутствия.</p>
7 <p>Ловушка<strong>get</strong>вызывается при каждом обращении к любому свойству объекта. На вход ей передается исходный объект и имя свойства, к которому идет обращение. Внутри же, можно строить любую логику. В нашем примере мы возвращаем значение свойства из target, если оно существует, и 0 в случае его отсутствия.</p>
8 <p>Рассмотрим теперь пример с ловушкой<strong>set</strong>:</p>
8 <p>Рассмотрим теперь пример с ловушкой<strong>set</strong>:</p>
9 <p>Теперь, если присвоить значение несуществующему свойству в объекте, то будет ошибка:</p>
9 <p>Теперь, если присвоить значение несуществующему свойству в объекте, то будет ошибка:</p>
10 <p>Концептуально, Proxy это такая штука, которая "не отсвечивает". Прикладной код не должен знать, что он работает с Proxy, а не с исходным объектом. Только в этом случае будет обеспечиваться прозрачная работа с Proxy, то есть не придется затачивать код под него. Частично ответственность за это лежит на программисте, а частично на Proxy. Поэтому:</p>
10 <p>Концептуально, Proxy это такая штука, которая "не отсвечивает". Прикладной код не должен знать, что он работает с Proxy, а не с исходным объектом. Только в этом случае будет обеспечиваться прозрачная работа с Proxy, то есть не придется затачивать код под него. Частично ответственность за это лежит на программисте, а частично на Proxy. Поэтому:</p>
11 <ul><li>У Proxy нет своих свойств, он всегда<strong>проксирует</strong>вызовы</li>
11 <ul><li>У Proxy нет своих свойств, он всегда<strong>проксирует</strong>вызовы</li>
12 <li>Из Proxy невозможно извлечь исходный объект и каким-то образом поменять его в обход ловушек</li>
12 <li>Из Proxy невозможно извлечь исходный объект и каким-то образом поменять его в обход ловушек</li>
13 <li>В соответствии со спецификацией, не существует способа определить, что объект это прокси (технически такая<a>возможность есть</a>, но в нормальной ситуации она не должна использоваться)</li>
13 <li>В соответствии со спецификацией, не существует способа определить, что объект это прокси (технически такая<a>возможность есть</a>, но в нормальной ситуации она не должна использоваться)</li>
14 </ul>
14 </ul>