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>