4
respostas

Diferenciando Reflect.get de Reflect.apply()

Olá, Flávio, tudo bem? A minha dúvida é referente a um pattern que foi frenquente tanto na aula quanto nos exercícios. Aqui está um exemplo que o segue:

new Proxy(new Pessoa('Barney'), {

        get(target, prop, receiver) {
            if(prop == 'grita' && typeof(target[prop]) == typeof(Function)) {

                return function() {
                    console.log(`Interceptei o método: ${prop}, por isso estou exbindo essa mensagem!`);    
                    return Reflect.apply(target[prop], target, arguments);       
                }
            }
            return Reflect.get(target, prop, receiver);
        }
    });

A minha dúvida é a seguinte: nós não deveríamos criar um tratamento para o caso do get no handler do Proxy ter interceptado um método do objeto 'Pessoa' que não o 'grita'?

Isso é, no caso da interceptação ser de uma propriedade, está claro que o handler funciona como deveria. Porém, no caso de ser um método, eu acredito que deveríamos fazer um tratamento diferente e terminar retornando

Reflect.apply(target[prop], target, arguments)

Estou louco, Flávio? Muito obrigado de antemão.

4 respostas

Bom dia! Acho que entendi sua pergunta. Só temos interesse de lidar com o método grita. Se não for ele, não precisamos fazer nenhum tratamento especial.

O problema do proxy é quando queremos mudar o comportamento de um método. Se não queremos mudar, o return Reflect.get(target, prop, receiver); dará conta.

Não sei com clareza se essa era sua dúvida. Qualquer coisa grita.

Bem, nesse caso, como a função saberia quais são os seus argumentos? Apenas retornando Reflect.get(target, prop, receiver) não entregamos isso.

Aliás, com isso teríamos como retorno a função em si e não ela exacutada, correto?

Você só precisa saber os argumentos se substituir a função ou método original e esse procedimento só é necessário quando queremos interceptar métodos. É por isso que precisamos indicar o nome do método porque não queremos sair alterando qualquer um.

Oi Victor! Tudo certo?