Get to know MDN better
Esta página foi traduzida do inglês pela comunidade. Saiba mais e junte-se à comunidade MDN Web Docs.
Começando com ECMAScript 6, o JavaScript ganha suporte para os objetos Proxy e Reflect, permitindo você interceptar e definir o comportamento personalizado para operações fundamentais da linguagem (por exemplo, pesquisa de propriedade, atribuição, enumeração, invocação de função, etc). Com a ajuda destes dois objetos você será capaz de programar a nível meta em JavaScript.
Introduzido em ECMAScript 6, objetos Proxy permitem que você intercepte determinadas operações e implementar comportamentos personalizados. Por exemplo, receber uma propriedade em um objeto:
O objeto Proxy define um target (um objeto vazio aqui) e um objeto handler em que um get trap é implementado. Aqui, um objeto que está em proxy não retornará indefinido quando receber propriedades indefinidas, mas, ao contrário, retornar o número 42.
Exemplos adicionais estão disponíveis na página de referência de Proxy .
Os seguintes termos são usados quando se fala sobre a funcionalidade de proxies.
handlerEspaço reservado de objeto que contenha traps.
trapsOs métodos que fornecem acesso de propriedade. Isto é análogo ao conceito de traps em sistemas operacionais.
targetObjeto que o proxy está virtualizando. Ele é frequentemente usado como backend de armazenamento para o proxy. Invariantes (semânticas que permanecem inalteradas) relativas a objetos que não podem ser extendidos ou propriedades que não podem ser configuradas são comparadas com o target.
invariantesSemânticas que permanecem inalteradas na execução de operações personalizadas são chamados de invariantes. Se você violar as invariantes de um manipulador, um TypeError será lançado.
A tabela a seguir resume as traps disponíveis aos objetos do tipo Proxy. Veja as páginas de referência para explicações detalhadas e exemplos.
| handler.getPrototypeOf() |
Object.getPrototypeOf() Reflect.getPrototypeOf() __proto__ Object.prototype.isPrototypeOf() instanceof |
|
| handler.setPrototypeOf() |
Object.setPrototypeOf() Reflect.setPrototypeOf() |
Se target não puder ser extendido, o parâmetro prototype dever ter o mesmo valor que Object.getPrototypeOf(target). |
| handler.isExtensible() |
Object.isExtensible() Reflect.isExtensible() |
Object.isExtensible(proxy) deve retornar o mesmo valor que Object.isExtensible(target). |
| handler.preventExtensions() |
Object.preventExtensions() Reflect.preventExtensions() |
Object.preventExtensions(proxy) retorna true somente se Object.isExtensible(proxy) retornar 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() |
1
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() |
Uma propriedade não pode ser excluída, se existir como uma propriedade própria não configurável do objeto de destino. |
| handler.enumerate() |
Property enumeration / for...in:
for (var name in proxy) {...} Reflect.enumerate() |
O método enumerate deve retornar um objeto. |
| handler.ownKeys() |
Object.getOwnPropertyNames() Object.getOwnPropertySymbols() Object.keys() Reflect.ownKeys() |
|
| handler.apply() |
proxy(..args) Function.prototype.apply() and Function.prototype.call() Reflect.apply() |
Não há invariantes para o método handler.apply |
| handler.construct() |
new proxy(...args) Reflect.construct() |
O resultado deve ser um Object. |
O método Proxy.revocable() é utilizado para criar um objeto Proxy revogável. Isso significa que o proxy pode ser revogado através da função revoke, desligando-o. Depois disso, qualquer operação com o proxy lançará um TypeError.
Reflect é um objeto embutido que contém métodos que permitem a criação de operações interceptáveis em JavaScript. Os métodos são iguais àqueles de proxy handlers. Reflect não é um objeto do tipo function.
Reflect auxilia no encaminhamento de operações padrão do handler para o target.
Reflect.has(), por exemplo, tem o mesmo efeito prático que o operador in, com a facilidade de ser utilizado como uma função:
Em ES5, você normalmente utiliza o método Function.prototype.apply() para invocar uma função com um dado valor para this e arguments fornecido como um array (ou um objeto parecido com um array).
Com Reflect.apply essa operação se torna menos verbosa e mais fácil de compreender:
Com Object.defineProperty, a qual retorna um object em caso de sucesso ou lança um TypeError em caso contrário, você utilizaria um bloco try...catch para capturar qualquer erro que tenha ocorrido ao definir uma propriedade. Devido ao fato de Reflect.defineProperty retornar um status do tipo Boolean, você pode simplesmente utilizar aqui um bloco if...else:
This page was last modified on 8 de dez. de 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.