Get to know MDN better
This page was translated from English by the community. Learn more and join the MDN Web Docs community.
С приходом ECMAScript 2015, в JavaScript введены объекты Proxy и Reflect, позволяющие перехватить и переопределить поведение фундаментальных процессов языка (таких как поиск свойств, присвоение, итерирование, вызов функций и так далее). С помощью этих двух объектов вы можете программировать на мета уровне JavaScript.
Введённый в ECMAScript 6, объект Proxy позволяет перехватить и определить пользовательское поведение для определённых операций. Например, получение свойства объекта:
Объект Proxy определяет target (в данном случае новый пустой объект) и handler - объект в котором реализована особая функция-ловушка get. "Проксированный" таким образом объект, при доступе к его несуществующему свойству вернёт не undefined, а числовое значение 42.
Дополнительные примеры доступны в справочнике Proxy.
В разговоре о функциях объекта Proxy применимы следующие термины:
handler (обработчик)Объект - обёртка, содержащий в себе функции-ловушки.
ловушки (traps)Методы, реализующие доступ к свойствам. В своей концепции они аналогичны методам перехвата(hooking) в операционных системах.
цель (target)Объект, который оборачивается в Proxy. Часто используется лишь как внутреннее хранилище для Proxy объекта. Проверка на нарушение ограничений (invariants), связанных с нерасширяемостью объекта или неконфигурируемыми свойствами объекта производится для конкретной цели.
неизменяемые ограничения (дословно Invariants - те что остаются неизменными)Некоторые особенности поведения объекта, которые должны быть сохранены при реализации пользовательского поведения названы invariants. Если в обработчике нарушены такие ограничения, будет выброшена ошибка TypeError.
В следующей таблице перечислены ловушки, доступные для использования в объекте Proxy. Смотрите подробные объяснения и примеры в документации.
| handler.getPrototypeOf() |
Object.getPrototypeOf() Reflect.getPrototypeOf() __proto__ Object.prototype.isPrototypeOf() instanceof |
|
| handler.setPrototypeOf() |
Object.setPrototypeOf() Reflect.setPrototypeOf() |
если целевой объект target нерасширяем, значение параметра prototype должно быть равным значению возвращаемому методом Object.getPrototypeOf(target). |
| handler.isExtensible() |
Object.isExtensible() Reflect.isExtensible() |
Object.isExtensible(proxy) должно возвращать тоже значение, что и Object.isExtensible(target). |
| handler.preventExtensions() |
Object.preventExtensions() Reflect.preventExtensions() |
Object.preventExtensions(proxy) возвращает true только в том случае, если Object.isExtensible(proxy) равно false. |
| handler.getOwnPropertyDescriptor() |
Object.getOwnPropertyDescriptor() Reflect.getOwnPropertyDescriptor() |
|
| handler.defineProperty() |
Object.defineProperty() Reflect.defineProperty() |
|
| handler.has() |
Property query: foo in proxy Inherited property query: foo in Object.create(proxy) Reflect.has() |
|
| handler.get() |
Property access: proxy[foo]and proxy.bar Inherited property access: Object.create(proxy)[foo] Reflect.get() |
|
| handler.set() |
Property assignment: proxy[foo] = bar and
proxy.foo = bar Inherited property assignment: Object.create(proxy)[foo] = bar Reflect.set() |
|
| handler.deleteProperty() |
Property deletion: delete proxy[foo] and
delete proxy.foo Reflect.deleteProperty() |
Свойство не может быть удалено, если оно существует в целевом объекте как собственное, неконфигурируемое свойство. |
| handler.enumerate() |
Property enumeration / for...in:
for (var name in proxy) {...} Reflect.enumerate() |
Метод enumerate должен возвращать объект. |
| handler.ownKeys() |
Object.getOwnPropertyNames() Object.getOwnPropertySymbols() Object.keys() Reflect.ownKeys() |
|
| handler.apply() |
proxy(..args) Function.prototype.apply() and Function.prototype.call() Reflect.apply() |
Ограничений нет. |
| handler.construct() |
new proxy(...args) Reflect.construct() |
Обработчик должен возвращать Object. |
Метод Proxy.revocable() создаёт отзываемый объект Proxy. Такой прокси объект может быть отозван функцией revoke, которая отключает все ловушки-обработчики. После этого любые операции над прокси объектом вызовут ошибку TypeError.
Reflect это встроенный объект, предоставляющий методы для перехватываемых операций JavaScript. Это те же самые методы, что имеются в обработчиках Proxy. Объект Reflect не является функцией.
Reflect помогает при пересылке стандартных операций из обработчика к целевому объекту.
Например, метод Reflect.has() это тот же оператор in но в виде функции:
В ES5 обычно используется метод Function.prototype.apply() для вызова функции в определённом контексте (с определённым this) и с параметрами, заданными в виде массива (или массива-подобного объекта).
С методом Reflect.apply эта операция менее громоздка и более понятна:
Метод Object.defineProperty, в случае успеха операции, возвращает объект, а при неудаче вызывает ошибку TypeError. Из-за этого определение свойств требует обработки блоком try...catch для перехвата возможных ошибок. Метод Reflect.defineProperty, в свою очередь, возвращает успешность операции в виде булева значения, благодаря чему возможно использование простого if...else условия:
This page was last modified on 14 дек. 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.