Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Armadilhas

De acordo com a atividade 17 do capítulo 2: "Resumindo a moral da história: armadilhas serão disparadas mesmo se tentarmos modificar uma propriedade congelada de um objeto, ainda que ele não seja modificado." Isso quer dizer que eu posso modificar um valor, sem alterar o verdadeiro valor de um objeto?

5 respostas

Hum, não exatamente, Vou explicar. Se você acessar uma propriedade, por exemplo, nome de um objeto que foi adicionado uma armadilha e o objeto foi congelado do freeze, o que você vai executar é o código da armadilha, por exemplo, para exibir a data e hora que a propriedade foi acessada. No entanto, e o código da armadilha tentar tocar na propriedade congelada, nada vai acontecer, porque o objeto original ignorará a operação de modificação.

Vou escrever um código para vc entender melhor....um minuto...

solução!

Veja um exemplo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <script>
        var pessoa = { nome: 'Flávio'};

        Object.freeze(pessoa);

        pessoa.nome = 'Vinícius'; // não dá erro, mas também não altera

        console.log(pessoa.nome); // exibe 'Flávio'

        proxy = new Proxy(pessoa, {

            set(target, prop, value, receiver) {
                 console.log(`A propriedade ${prop} receberá  ${value}`)

                 console.log(new Date()); // imprime a data e hora que a propriedade é acessada 

                 // aqui estamos modificando a propriedad original, mas como ela esta congelada no target, nada vai acontecer.
                 return Reflect.set(target, prop, value, receiver);
            }
        });

        proxy.nome = 'Vinícius';

        console.log(proxy.nome); // Continua Flávio, mas o código da armadilha foi executado
    </script>

</body>
</html>

Então o que você quis mostrar é que se eu congelar a propriedade de um objeto, não faz sentido eu usar o padrão proxy? É isso?

Faz, foi justamente o que quis mostrar no código. Se você quiser saber a data e hora de quando a propriedade foi acessada ou quando tentaram modificar? Você consegue com a armadilha.

Ou, se quando alguém tentar modificar a propriedade, seja congelada ou não, você quiser enviar uma mensagem para um servidor e notificar alguém. As armadilhas ajudarão nisso.

Pense que uma armadilha é um pedaço de código, escondido, que é executado toda vez que alguém acessa uma propriedade ou chama uma função. Não importa se o objeto é congelado ou não. O nome mais bonito para armadilha talvez seja interceptador, apesar deu evitar tê-lo utilizado para não confundir com conceito de outras linguagens.

Muito Obrigado, Flávio! Eu consegui entender melhor.