Prestando um pouco de atenção no video, pude reparar que a mensagem de "Negociação adicionada com sucesso" apareceu apenas depois que uma negociação já foi adicionada (aula: Nosso proxy ainda não está 100%!, momento: 5:29).
Por quê?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
Prestando um pouco de atenção no video, pude reparar que a mensagem de "Negociação adicionada com sucesso" apareceu apenas depois que uma negociação já foi adicionada (aula: Nosso proxy ainda não está 100%!, momento: 5:29).
Por quê?
Porque faltou uma instrução que eu coloco mais a frente. Como isso gerou dúvida, no mesmo vídeo pedi para que a equipe de edição incluísse a instrução que estava faltando antecipadamente, inclusive com uma seta indicando o local onde ela deve ser inserida.
https://cursos.alura.com.br/course/javascript-es6-orientacao-a-objetos-parte-2/task/17491
Veja no minuto 2.:48.
Desculpe qualquer transtorno que isso possa ter causado.
Pessoal,
Não precisei adicionar a instrução que faltou e que foi acrescentado depois, apenas troquei a lógica e funcionou, vejam:
class ProxyFactory {
static create(objeto, props, acao) {
return new Proxy(objeto, {
get (target, prop, receiver) {
if (props.includes(prop) && typeof(target[prop]) == typeof(Function)) {
return function() {
Reflect.apply(target[prop], target, arguments);
return acao(target);
}
}
return Reflect.get(target, prop, receiver);
},
set(target, prop, value, receiver) {
let retorno = Reflect.set(target, prop, value, receiver);
if (props.includes(prop)) {
acao(target);
}
return retorno;
}
});
}
}
Penso que dessa forma está até mais correto, pois a ação somente deve ser executada após o set da proxy no target.
O que acham?
Pablo, parabéns pela implementação. Acho que sua sacada foi mais interessante que a apresentada no curso, visto que no curso você acaba realizando a mesma operação (set) duas vezes:
set(target, prop, value, receiver) {
if(props.includes(prop) {
// Seta valor para a propriedade interceptada
target[prop] = value;
acao(target);
})
// Novamente seta valor para a propriedade interceptada
return Reflect.set(target, prop, value, receiver);
}
Sim
Para entender melhor, oque aconteceu no vídeo é que o método _mensagemView(model) =>acao(target) é chamado antes da função mensage.texto = valor => Reflect.set(...)
A lógica do Pablo Medeiros resolve. Pois o método que atualiza foi executado após a mudança de atribuição
Outro detalhe é que o método set de um objeto espera um boolean para realizar a atribuição. Corrigindo type error on "set"
Se preferir seguir como está no video é preciso alterar de "target(prop) = value" para "target[prop] = value"