Rodrigo,
o que ocorre nessa situação é apenas questão de ordem de execução das coisas, vamos ao primeiro cenário sugerido por você:
set(target, prop, value, receiver) {
if (props.includes(prop)) {
acao(target);
}
return Reflect.set(target, prop, value, receiver);
}
Neste caso, o método testa a se a propriedade deve ser intercptada, executa a ação (que no caso é a atualização da view) e depois que aplica o Reflect! Ou seja, quando a view é atualizada, a mensagem ainda não foi setada pois o Reflect.apply
ainda não ocorreu!
O bloco do if também não pode ser executado depois pois não podemos ter instruções após a clausula return
Agora vamos ao segundo cenário:
set(target, prop, value, receiver) {
let retorno = Reflect.set(target, prop, value, receiver);
if (props.includes(prop)) {
acao(target);
}
return retorno;
}
Neste caso agora a primeira coisa executa é o Reflect.set
para atribuir o valor a propriedade e só então a propriedade é testada verificando se a ação (que no caso é a atualização da view) deve ser executada!
Mas o método set espera um valor booleano como retorno que é justamente o resultado gerado pelo Reflect.apply
e por isso precisamos armazenar esse resultado para encaminha-lo depois!
Caso você execute o primeiro cenario, a aplicação só exibiria a mensagem na segunda execução, pois as coisas ocorreriam na seguinte ordem:
Executa chamada 01:
1 - Atualiza mensagemView (mensagem.texto=null)
2-Atribui mensagem (mensagem.texto = <valor_chamada_01>
)
Executa chamada 02:
1 - Atualiza mensagemView (mensagem.texto=<valor_chamada_01>
)
2-Atribui mensagem (mensagem.texto = <valor_chamada_02>
)
Observe que na verdade como as chamadas atribuem o mesmo texto, as vezes não percebemos, mas a mensagem que aparece na segunda chamada, é o valor que foi atribuído ainda na primeira execução!
Espero que possa esclarecer sua dúvida!
Até mais e bons estudos