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

Dúvida na prova teórica da formação frontend

O que será exibido na PRIMEIRA e SEGUNDA chamada respectivamente?

class Pessoa {

    constructor(nome) {
        this.nome = nome;
    }
}

function exibeNome() {
    alert(this.nome);
}

let pessoa = new Pessoa('Paulo');

exibeNome('Zeca'); // PRIMEIRA CHAMADA <=============

exibeNome = exibeNome.bind(pessoa);

exibeNome();

Com base neste código eu escolhi minha resposta e para minha surpresa estava errada, na questão respondi que daria "undefined e Paulo". Até por que no meu ver na primeira chamada ele esta passando uma string para o método, porém o mesmo não está programada para receber nenhum parametro. Então na primeira chamada daria "undefined" por não ter valores, mas na segunda chamada, atraves do bind ele conseguiria executar o método com o valor desejado. Estou deixando passar alguma coisa? Help me!

3 respostas

OK, vamos lá

Temos um código parecido!?

class Pessoa {

    constructor(nome) {
        this.nome = nome;
    }
}

function exibeNome() {
    alert(this.nome);
}

let pessoa = new Pessoa('Salsifufu');

exibeNome('Lampreia'); // PRIMEIRA CHAMADA <=============

exibeNome = exibeNome.bind(pessoa);

exibeNome(); // SEGUNDA CHAMADA <=============

Primeiramente foi instanciado um objeto da classe Pessoa, no construtor foi passado uma string, que representa o nome da pessoa, até aqui tudo tranquilo.

Na primeira chamada, no método exibeNome(‘Zeca’), não foi associado a nenhum objeto da classe Pessoa, ele simplesmente foi chamado, sem contexto.

Toda a mágica acontece nessa linha:

exibeNome = exibeNome.bind(pessoa);

Perceba que, o método exibeNome() faz um bind (isso significa que ele foi associado a um objeto) no objeto da classe Pessoa, agora sim temos o método exibeNome() com acesso aos atributos do objeto da classe pessoa para uso.

Lembra que passamos um nome no momento da instanciação do objeto da classe Pessoa?

Então vamos ter acesso a ele nesse momento:

exibeNome();

Isso acontece por causa que esse método agora está no contexto do objeto da classe Pessoa, e temos acesso ao atributo nome do mesmo. Por isso que a resposta certa é:

undefined e Salsifufu

No primeira chamada não tínhamos acesso ao objeto da classe Pessoa, então o método exibeNome(); retorna undefined. No segundo momento, quando associamos o método ao objeto Pessoa o mesmo tem acesso ao atributo nome, então ele retorna Salsifufu.

Então minha resposta está correta, como faço pra passar este erro para correção!?

solução!

Na tela da questão:

No canto direito superior temos um botão com três pontinho, você pode clicar nele e sugerir uma melhoria.

OU

Você pode abrir um tópico aqui no fórum, com uma reclamação sobre essa questão.