Opa, agora no meu computador ficar mais fácil. Veja o método:
static create(objeto, props, acao) {
return new Proxy(objeto, {
get(target, prop, receiver) {
if(props.includes(prop) && ProxyFactory._ehFuncao(target[prop])) {
return function() {
Reflect.apply(target[prop], target, arguments);
return acao(target); // OLHA AQUI.... ESTA CHAMANDO SUA FUNCAO PASSANDO TARGET QUE E ACESSADO VIA MODEL NO SEU CALLBACK
}
}
return Reflect.get(target, prop, receiver);
}
})
}
O método create recebe 3 parâmetros, objeto para o qual desejamos criar o proxy (pode lê-lo como model...), as propriedades monitoradas e o código que você deseja executar quando uma dessas propriedades forem alteradas (isso, porque só estamos interessados em sermos notificados nas mudanças).
Quando alteramos uma das propriedades de props, a função passada como terceiro parâmetro é executada, no caso, referenciamos dentro do método create como acao. Até ai tudo bem, meu aluno candidato cangaceiro em JavaScript?
Então.. veja que no miolo do código há return acao(target). Isso indica que, para a função com a lógica que você passou, ela receberá como parâmetro o target (objeto alvo do proxy....target aqui é a mesma coisa que objeto passado como primeiro parâmetro, mas um atalho dentro do proxy). Ai vem o mistério resolvido, o tal model do código é esse target que foi passado para sua função de callback para executar sua lógica. No caso, sua lógica é passar o objeto que foi alterado (model) para a view que fará o upgrade.
Assim que avançar, verá que você fará um mecanismo de data binding assim como outros frameworks fazem, tudo com JavaScript puro.
Ficou mais claro agora?
Ah, o nome model poderia ser qualquer outro, por exemplo:
this._mensagem = ProxyFactory.create(
new Mensagem(),
['texto'],
calopsita=>this._mensagemView.update(calopsita)
)
É o mesma coisa no JavaScript basicão, você passa um callback e nesse callback recebe o retorno da operação e aqui pode dar qualquer nome.