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
.
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: