Get to know MDN better
This page was translated from English by the community. Learn more and join the MDN Web Docs community.
This feature is well established and works across many devices and browser versions. It’s been available across browsers since сентябрь 2016 г..
Объект Proxy позволяет создать прокси для другого объекта, может перехватывать и переопределить основные операции для данного объекта.
Прокси используются программистами для объявления расширенной семантики JavaScript объектов. Стандартная семантика реализована в движке JavaScript, который обычно написан на низкоуровневом языке программирования, например C++. Прокси позволяют программисту определить поведение объекта при помощи JavaScript. Другими словами они являются инструментом метапрограммирования.
Примечание: реализация прокси в SpiderMonkey является прототипом, в котором прокси API и семантика не стабильны. Также, реализация в SpiderMonkey может не соответствовать последней версии спецификации. Она может быть изменена в любой момент и предоставляется исключительно как экспериментальная функция. Не полагайтесь на неё в производственном коде.
Эта страница описывает новый API (называемый «непосредственным проксированием»), который является частью Firefox 18. Для просмотра старого API (Firefox 17 и ниже) посетите страницу описания старого прокси API.
Технический термин для этой функции.
прокси (proxy)Объект, оборачивающий исходный объект.
обработчик (handler)Объект-заменитель, содержащий ловушки. Определяет, какие операции будут перехвачены, также переопределяет перехваченные операции.
ловушки (traps)Методы, которые предоставляют доступ к свойствам. Это аналогично концепции ловушек в операционных системах.
цель (target)Исходный объект, который виртуализируется прокси. Он часто используется в качестве источника данных в прокси. Для него проверяются инварианты относительно расширяемости и настраиваемости свойств.
Прокси - это новые объекты; невозможно выполнить "проксирование" существующего объекта. Пример создания прокси:
Где:
Все ловушки опциональны. В случае, если ловушка не задана, то стандартным поведением будет перенаправление операции к объекту-цели.
| Object.getOwnPropertyDescriptor(proxy, name) | getOwnPropertyDescriptor function(target, name) -> PropertyDescriptor | undefined | Должен возвращать верный объект-описание свойства или undefined, чтобы показать, что свойство с именем name существует в эмулируемом объекте. |
| Object.getOwnPropertyNames(proxy) Object.getOwnPropertySymbols(proxy) Object.keys(proxy) | ownKeys function(target) -> [string | symbol] | Возвращает массив всех собственных (не унаследованных) имён свойств эмулируемого объекта. |
| Object.defineProperty(proxy,name,pd) | defineProperty function(target, name, propertyDescriptor) -> any | Задаёт новое свойство, атрибуты которого определяются предоставленным propertyDescriptor. Возвращаемое значение метода игнорируется. |
| delete proxy.name | deleteProperty function(target, name) -> boolean | Удаляет именованное свойство из прокси. Возвращает true в случае успешного удаления свойства name. |
| Object.preventExtensions(proxy) | preventExtensions function(target) -> boolean | Делает объект нерасширяемым. Возвращает true при успешном выполнении. |
| name in proxy | has function(target, name) -> boolean | |
| proxy.name (in the context of "getting the value") receiver.name (if receiver inherits from a proxy and does not override name) | get function(target, name, receiver) -> any | receiver — это прокси или объект, унаследованный от прокси. |
| proxy.name = val (in the context of "setting the value") receiver.name = val (if receiver inherits from a proxy and does not override name) | set function(target, name, val, receiver) -> boolean | receiver — это прокси или объект, унаследованный от прокси. |
| proxy(...args) proxy.apply(thisValue, args) proxy.call(thisValue, ...args) | apply function(target, thisValue, args) -> any | target должен быть функцией. |
| new proxy(...args) | construct function(target, args) -> object | target должен быть функцией. |
Несмотря на то, что прокси предоставляют много возможностей пользователям, некоторые операции не перехватываются для сохранения постоянства языка:
Объект, возвращающий значение 37, в случае отсутствия свойства с указанным именем:
В данном примере мы используем JavaScript объект, к которому наш прокси направляет все запросы:
При помощи Proxy вы можете легко проверять передаваемые объекту значения:
Функция прокси может легко дополнить конструктор новым:
Иногда возникает необходимость переключить атрибут или имя класса у двух разных элементов:
Прокси объект products проверяет передаваемые значения и преобразует их в массив в случае необходимости. Объект также поддерживает дополнительное свойство latestBrowser на чтение и запись.
Данный прокси расширяет массив дополнительными возможностями. Как вы видите, вы можете гибко "задавать" свойства без использования Object.defineProperties. Данный пример также может быть использован для поиска строки таблицы по её ячейке. В этом случае целью будет table.rows.
В данном примере, использующем все виды перехватчиков, мы попытаемся проксировать не нативный объект, который частично приспособлен для этого - docCookies, созданном в разделе "little framework" и опубликованном на странице document.cookie.
Некоторое содержимое (текст, примеры) данной страницы было скопировано или адаптировано со страниц вики ECMAScript, имеющей лицензию CC 2.0 BY-NC-SA
This page was last modified on 24 мар. 2025 г. by MDN contributors.
Your blueprint for a better internet.
Visit Mozilla Corporation’s not-for-profit parent, the Mozilla Foundation.
Portions of this content are ©1998–2026 by individual mozilla.org contributors. Content available under a Creative Commons license.