| [ Web Proxy ] |
| Viewing: https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Guide/Meta_programming | [Back] [Original] |
Get to know MDN better
Esta pgina foi traduzida do ingls pela comunidade. Saiba mais e junte-se comunidade MDN Web Docs.
Comeando com ECMAScript 6, o JavaScript ganha suporte para os objetos Proxy e Reflect, permitindo voc interceptar e definir o comportamento personalizado para operaes fundamentais da linguagem (por exemplo, pesquisa de propriedade, atribuio, enumerao, invocao de funo, etc). Com a ajuda destes dois objetos voc ser capaz de programar a nvel meta em JavaScript.
Introduzido em ECMAScript 6, objetos Proxy permitem que voc intercepte determinadas operaes e implementar comportamentos personalizados. Por exemplo, receber uma propriedade em um objeto:
var handler = {
get: function (target, name) {
return name in target ? target[name] : 42;
},
};
var p = new Proxy({}, handler);
p.a = 1;
console.log(p.a, p.b); // 1, 42
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 no retornar indefinido quando receber propriedades indefinidas, mas, ao contrrio, retornar o nmero 42.
Exemplos adicionais esto disponveis na pgina de referncia de Proxy .
Os seguintes termos so usados quando se fala sobre a funcionalidade de proxies.
Espao reservado de objeto que contenha traps.
Os mtodos que fornecem acesso de propriedade. Isto anlogo ao conceito de traps em sistemas operacionais.
Objeto que o proxy est virtualizando. Ele frequentemente usado como backend de armazenamento para o proxy. Invariantes (semnticas que permanecem inalteradas) relativas a objetos que no podem ser extendidos ou propriedades que no podem ser configuradas so comparadas com o target.
Semnticas que permanecem inalteradas na execuo de operaes personalizadas so chamados de invariantes. Se voc violar as invariantes de um manipulador, um TypeError ser lanado.
A tabela a seguir resume as traps disponveis aos objetos do tipo Proxy. Veja as pginas de referncia para explicaes detalhadas e exemplos.
| Handler / trap | Interceptions | Invariants |
|---|---|---|
handler.getPrototypeOf()
|
Object.getPrototypeOf()Reflect.getPrototypeOf()__proto__Object.prototype.isPrototypeOf()instanceof
|
|
handler.setPrototypeOf()
|
Object.setPrototypeOf()Reflect.setPrototypeOf()
|
Se |
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 proxyInherited property query: foo in Object.create(proxy)Reflect.has()
|
|
handler.get()
|
1
Property access: proxy[foo]and proxy.barInherited property access: Object.create(proxy)[foo]Reflect.get()
|
|
handler.set()
|
Property assignment: proxy[foo] = bar and
proxy.foo = barInherited property assignment: Object.create(proxy)[foo] = barReflect.set()
|
|
handler.deleteProperty()
|
Property deletion: delete proxy[foo] and
delete proxy.fooReflect.deleteProperty()
|
Uma propriedade no pode ser excluda, se existir como uma propriedade prpria no configurvel do objeto de destino. |
handler.enumerate()
|
Property enumeration / for...in:
for (var name in proxy) {...}Reflect.enumerate()
|
O mtodo |
handler.ownKeys()
|
Object.getOwnPropertyNames()Object.getOwnPropertySymbols()Object.keys()Reflect.ownKeys()
|
|
handler.apply()
|
proxy(..args)Function.prototype.apply() and
Function.prototype.call()Reflect.apply()
|
No h invariantes para o mtodo |
handler.construct()
|
new proxy(...args)Reflect.construct()
|
O resultado deve ser um Object. |
O mtodo Proxy.revocable() utilizado para criar um objeto Proxy revogvel. Isso significa que o proxy pode ser revogado atravs da funo revoke, desligando-o. Depois disso, qualquer operao com o proxy lanar um TypeError.
var revocable = Proxy.revocable(
{},
{
get: function (target, name) {
return "[[" + name + "]]";
},
},
);
var proxy = revocable.proxy;
console.log(proxy.foo); // "[[foo]]"
revocable.revoke();
console.log(proxy.foo); // TypeError lanado
proxy.foo = 1; // TypeError novamente
delete proxy.foo; // ainda um TypeError
typeof proxy; // "object", typeof no desencadeia nenhuma trap
Reflect um objeto embutido que contm mtodos que permitem a criao de operaes interceptveis em JavaScript. Os mtodos so iguais queles de proxy handlers. Reflect no um objeto do tipo function.
Reflect auxilia no encaminhamento de operaes padro do handler para o target.
Reflect.has(), por exemplo, tem o mesmo efeito prtico que o operador in, com a facilidade de ser utilizado como uma funo:
Reflect.has(Object, "assign"); // true
apply melhoradaEm ES5, voc normalmente utiliza o mtodo Function.prototype.apply() para invocar uma funo com um dado valor para this e arguments fornecido como um array (ou um objeto parecido com um array).
Function.prototype.apply.call(Math.floor, undefined, [1.75]);
Com Reflect.apply essa operao se torna menos verbosa e mais fcil de compreender:
Reflect.apply(Math.floor, undefined, [1.75]);
// 1;
Reflect.apply(String.fromCharCode, undefined, [104, 101, 108, 108, 111]);
// "hello"
Reflect.apply(RegExp.prototype.exec, /ab/, ["confabulation"]).index;
// 4
Reflect.apply("".charAt, "ponies", [3]);
// "i"
Com Object.defineProperty, a qual retorna um object em caso de sucesso ou lana um TypeError em caso contrrio, 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:
if (Reflect.defineProperty(target, property, attributes)) {
// success
} else {
// failure
}
This page was last modified on 17 de jul. de 2026 by MDN contributors.
Your blueprint for a better internet.
Portions of this content are 19982026 by individual mozilla.org contributors. Content available under a Creative Commons license.
| Web Proxy Viewer | New URL | Original Page |