3
respostas

A constante numeroDeContas sequer está na classe-mãe, queria entender a mensagem de erro

Compreendi que o método super está relacionado ao que é herdado da classe-mãe. Não entendi porque o erro, que nos fez entrar no assunto do super() não aparenta ter relação com isso.

A constante static numeroDeContas = 0; assim como seu incremento ContaCorrente.numeroDeContas += 1; que o erro aponta, estão declaradas dentro da classe ContaCorrente, no arquivo ContaCorrente.js.

Além disso, a justificativa para uso do super() na mencionada documentação do Mozilla, aponta que precisa ser usada antes que a palavra-chave this possa ser usada.

Não usamos o this, e a variável do incremento não está declarada na classe-mãe.

Entendi a aplicação do super, mas não entendi o erro apontado pelo terminal. Mais alguém na mesma?

Valeu, abraços!

3 respostas

Poderia printar o código apontado pelo terminal e nos mostrar o trecho do seu código para que possamos dar uma olhada, por favor?

Oi, Vanessa.

É o erro que acontece na aula do professor. Na aula anterior a esta, que aponta erro de referência na constante que informei acima. Eu não reproduzi o código pois o faço ao final da aula, e não reproduzi porque sabia que teria uma mensagem de erro.

É um erro de referência, apontado na linha da iteração da constante. Aos 10:12min da aula anterior.

Postei a dúvida aqui, nesta aula, pois é nesta onde ele explica melhor o super().

Mas não entendi a relação com a mensagem:

ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor

Na transcrição da aula :

|10:12| Estamos executando e está dando um erro em ContaCorrente, no trecho ContaCorrente.numeroDeContas += 1, na hora que ele veio passar nessa linha ele deu um erro, e o nosso erro foi um erro de referência. A mensagem dessa vez é um pouco diferente, você precisa chamar o super construtor na hora de derivar uma classe, antes de acessar o this.

Entendi.

Segundo o que vi no vídeo, o erro não está relacionado a ContaCorrente.numeroDeContas += 1, mas é preciso observar que, o terminal aponta que o erro ocorreu antes de ContaCorrente.numeroDeContas += 1.

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

E o erro de referência está acontecendo, porque se está herdando uma classe, no caso da classe pai, mas não se está criando uma referência da classe pai na classe filha.

Teoricamente, teríamos que instanciar a classe Conta dentro de ContaCorrente, porém não faz muito sentido fazer isso dentro de um construtor de uma classe. Por isso, a palavra super é utilizada. Ele comenta disso aqui:

[10:42] Então o teste é, sempre que fazemos essa herança, como fizemos na ContaCorrente, para o JavaScript ele precisa criar o objeto Conta para falar: "você herda todas essas propriedades na hora em que você for construido aqui no seu construtor". E para isso precisamos chamar o construtor da classe Conta.

[11:00] Só que normalmente nós chamamos o construtor com o new, então eu vou ter que chamar o new Conta() aqui no construtor da ContaCorrente. Só que chamar o new Conta não faz muito sentido quando eu estou dentro de uma classe, então o que usaremos é uma palavra especial que se chama super.

[11:13] O super é uma palavra especial que vai chamar o construtor da classe pai. Não é sempre que ele vai chamar o construtor, na verdade, ele depende do método em que ele está dentro.

Sobre a palavra chave super e o uso de this

A palavra super, apesar de reservada, não é um padrão necessariamente do JS, mas do paradigma de programação orientada a objetos. E é utilizada sempre que precisamos informar à classe filha que iremos usar o construtor da classe pai, E, então, o this é usado para referenciar a classe atual e o contexto.

A MDN diz não só que deve ser usada antes de this, mas:

A palavra-chave super é usada para acessar o objeto pai de um objeto, em outros casos, é usada para acessar a classe pai de uma classe.

Ou seja, uso a palavra chave super sempre que herdar o construtor e/ou da classe pai. O this serve para se referir ao contexto da classe atual.

Observe:

class Pessoa {

    constructor(nome, idade) {
        this._nome = nome;
        this._idade = idade;
    }

    // Getters e Setters

}

class Funcionario extends Pessoa {

    static numero = 0;

    constructor(nome, idade) {
        super(nome, idade);
        Funcionario.numero += 1;
    }

    getMatricula() {
        return `Matrícula: ${Funcionario.numero}`;
    }

}

const funcionario01 = new Funcionario('Fred', 25, 123456);
console.log(funcionario01);
// Funcionario { _nome: 'Fred', _idade: 25, _matricula: 123456 }
console.log(funcionario01.getMatricula());
// Matrícula: 1

Para saber mais, sugiro dar uma olhada em:

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software