Em Javascript, Proxies permite interceptar operações de objetos específicos e personalizá-las. O Proxy atua como intermediário entre o objeto e o “mundo real”. Assim, você pode aprimorar as operações básicas de um objeto para implementar uma lógica mais complexa ou redefinir operações fundamentais para atender às suas necessidades.
Os casos de uso incluem:
O proxy usa dois parâmetros:
const target = { greeting1: "Hello", greeting2: "Good morning" } const handler = { get(target, prop, receiver) { return target[prop] " friends!" } } const proxy = new Proxy(target, handler) console.log(proxy.greeting1) // Hello friends! console.log(proxy.greeting2) // Good morning friends!
Neste exemplo, definimos um Proxy. O objeto de destino possui duas propriedades. Definimos um manipulador que fornece uma implementação do manipulador get(). A armadilha get intercepta o acesso a qualquer propriedade do objeto alvo e, dentro dela, podemos modificar o comportamento conforme necessário.
Com esta configuração, significa que toda vez que acessarmos propriedades no objeto de destino, o manipulador o interceptará e executará o código que implementamos. No nosso caso, basta pegar o valor do imóvel e adicionar amigos!.
Muitas vezes, os proxies são usados com a API Reflect. Reflect fornece métodos com os mesmos nomes das armadilhas Proxy. Como o próprio nome indica, ele reflete a semântica para invocar os métodos internos do objeto correspondente.
const target = { greeting1: "Hello", greeting2: "Good morning" } const handler = { get(target, prop, receiver) { return Reflect.get(...arguments) " friends!" } } const proxy = new Proxy(target, handler) console.log(proxy.greeting1) // Hello friends! console.log(proxy.greeting2) // Good morning friends!
Reflect não é necessário para usar Proxies, mas usar Reflect nos permite ter certeza de que o comportamento corresponde às operações nativas do mecanismo Javascript. Também garante compatibilidade com atualizações futuras, evita efeitos colaterais indesejados e simplifica o código. Sem ele, o desenvolvedor teria que reimplementar comportamentos como acesso a propriedades, atribuição, exclusão... que podem ser propensos a erros e inconsistentes com o comportamento nativo do Javascript.
Vamos construir alguns exemplos para explorar o que podemos fazer com Proxy.
Em nosso primeiro exemplo, digamos que desejamos registrar quais ações são executadas em um objeto. Sempre que obtemos, definimos ou excluímos uma propriedade, quero imprimi-la no console. Isso pode ser útil para fins de depuração.
const target = { name: "Damien", age: 32, status: "WRITING" } const loggerHandler = { get(target, prop, receiver) { if (prop in target) { console.log(`[LOG] Accessing property ${prop}. Current value is ${target[prop]}`) return Reflect.get(...arguments) } else { console.error(`[LOG] Error accessing non-existent property ${prop}`) } }, set(target, key, value) { console.log(`[LOG] Setting property ${key}. New value: ${value}`) return Reflect.set(...arguments) }, deleteProperty(target, prop) { console.warn(`[LOG] Deleting property: ${prop}`) return Reflect.deleteProperty(...arguments) } } const proxy = new Proxy(target, loggerHandler) proxy.name // [LOG] Accessing property name. Current value is Damien proxy.status // [LOG] Accessing property status. Current value is WRITING proxy.name = "Bob" // [LOG] Setting property name. New value: Bob proxy.status = "NAPPING" // [LOG] Setting property status. New value: NAPPING proxy.job = "Developer" // [LOG] Setting property job. New value: Developer delete proxy.job // [LOG] Deleting property: job proxy.job // [LOG] Error accessing non-existent property job
Definimos um loggerHandler que redefine 3 operações fundamentais: obter, definir e excluir. Para cada ação, registramos algo no console descrevendo o que está acontecendo. A beleza do Proxy é que não precisamos escrever a instrução do console todas as vezes. Interagimos com nosso objeto como sempre fazemos, e o proxy cuida do comportamento do log. Muito legal, não?
Em nosso segundo exemplo, usaremos um proxy para realizar validações de entrada para dados de formulário.
const validationRules = { name: value => value.length >= 3 || "Name must be at least 3 characters long", age: value => Number.isInteger(value) || "Age must be a number", email: value => value.includes('@') || "Enter a valid email" } let formData = { name: "", age: null, email: "" } const formHandler = { set(target, key, value) { if (typeof value === "string") { value = value.trim() } const validationResult = validationRules[key](value) if (validationResult !== true) { console.error(`Validation failed for property ${key}: ${validationResult}`) return false; } return Reflect.set(...arguments) } } const formProxy = new Proxy(formData, formHandler) formProxy.age = "32 years old" // Validation failed for property age: Age must be a number formProxy.name = "Da" // Validation failed for property name: Name must be at least 3 characters long formProxy.email = "damcoss mail.com" // Validation failed for property email: Enter a valid email formProxy.age = 32 // OK formProxy.name = "Damien" // OK formProxy.email = "[email protected]" // OK
Definimos aqui um objeto com diferentes métodos usados para validar se os valores são válidos ou não. Então, usamos a mesma lógica. Temos nosso objeto de destino formData que queremos proxy. No formHandler, redefinimos o método set() para aplicar nossas regras de validação nos valores de entrada.
Proxies, combinados com a API Reflect, são ferramentas flexíveis e poderosas para interceptar e personalizar operações em objetos. Usando-os, você pode aprimorar e controlar o comportamento de forma dinâmica. Ao usar a API Reflect, você também garante que o comportamento seja consistente com o mecanismo Javascript.
Os proxies são frequentemente usados em bibliotecas e estruturas para permitir comportamentos avançados, como programação reativa, wrappers de API e observação de propriedades.
Divirta-se ❤️
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3