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

Reflect.apply x prototype.apply x prototype.bind

Na explicação do instrutor temos a seguinte explicação:

Reflect é um artefato novo do ES2015! Contudo, poderíamos conseguir o mesmo resultado dessa forma:

// No ES5
voar() {
    Aviao.prototype.voa.apply(this, []);
}

Essa solução é menos verbosa, mas a ideia do ES2015 foi centralizar operações como essa em Reflect e com o tempo esse deve se tornar o método mais indicado para realizar operações como essa.

Considerando a leitura de outros topicos aqui no forum mesmo, os códigos abaixo seriam então equivalentes:

class Passarinho {
    //Codigo omitido.....

    voa() {
    // executa o método `voa` de `Avião` usando como contexto a instância de `Passarinho`
    Reflect.apply(Aviao.prototype.voa, this, []);
    }
}

com este

class Passarinho {
    //Codigo omitido.....

    voa() {
    // executa o método `voa` de `Avião` usando como contexto a instância de `Passarinho`
    Aviao.prototype.voa.apply(this, []);
    }
}

com este

class Passarinho {
    //Codigo omitido.....

    voa() {
    // executa o método `voa` de `Avião` usando como contexto a instância de `Passarinho`
    Aviao.prototype.voa.bind(this)();
    }
}

Lembrando que no caso do bind uma nova função é retornada e por isso precisa definir a chamada imediata ao final, já no caso do apply ele mesmo chama o método internamente. Testei os codigos aqui e o comportamento de escrita no log foi o mesmo.

Existe alguma pratica recomendada ou fica "a gosto do freguês"?

Como a diferença é sutil, percebi apenas que nos casos onde a função não deve ser chamada no ato é preferencial usar o bind e sem querer entrar muito no mérito de compatibilidade pois o curso explorará isso mais na frente, mas pela documentação abaixo a classe Reflect não é suportada pelo "InhEca" enquanto o método bind sim.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Reflect

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind

Queria uma opinião para confirmar se este raciocínio esta correto

Grato

3 respostas
solução!

Correto! O bind tem esse detalhe que você já percebeu.

Bacana Flavio! Obrigado e mais uma vez parabens pela excelente serie de treinamentos JS!

Sugira mais cursos avançados . Só em minha mente tenho mais uns 4!

https://trello.com/b/4grNfK1m/alura-alunos-cursos

Sucesso e bom estudo!