Não consegui entender direito quando usar "super", alguem consegue me ajudar?
Não consegui entender direito quando usar "super", alguem consegue me ajudar?
Fala, Igor! Como vai?
O super
se refere a algum método da classe-mãe. Vamos supor que temos a seguinte classe:
class ClasseMae {
constructor() {
console.log('Olá mundo, de dentro da classe-mãe')
}
}
E extendemos ela:
class ClasseFilha extends ClasseMae {
constructor() {
super()
console.log('Olá mundo, de dentro da classe-filha')
}
}
O resultado será primeiro um console
dizendo Olá mundo, de dentro da classe-mãe
e depois um console
dizendo Olá mundo, de dentro da classe-filha
. Ou seja: executa-se o código do construtor da classe-mãe, e depois continua a execução do construtor da classe-filha.
O método que super
referencia depende do método que ele está sendo chamado na classe-filha. Ele irá procurar o método de mesmo nome na classe-mãe. No caso de ser chamado dentro de um construtor, ele irá referenciar o construtor da classe-mãe e só deve ser chamado uma vez.
Essa é a parte mais clara da necessidade de super
. Agora, vamos para os motivos mais próximos do funcionamento interno do JavaScript.
A classe-filha herda de classe-mãe. Entretanto, se não usarmos super
, o construtor da classe-filha apenas cria uma instância da classe-filha. O problema é que a classe-filha precisa de vários atributos da classe-mãe, as quais ela não tem acesso porque um objeto da classe-mãe não existe para que ela acesse. Usamos o super
para criá-lo.
Pense em uma linha de produção de carros: uma pintura será feita no carro em produção. Mas para a pintura ser feita, é preciso que o carro exista e esteja ali para ser pintado. É uma relação de dependência, certo? A classe-filha é a pintura e a classe-mãe é o carro.
Além disso, como o próprio erro já diz, se você quer referenciar alguma propriedade da sua classe-filha com this
, você precisa chamar o super
antes. Por isso, geralmente o super
é colocado na primeira linha do construtor da classe-filha.
Resumindo: sempre que a sua classe for uma subclasse (extende de outra classe), o construtor vai precisar executar o super()
, e sempre que você quiser referenciar um método da classe-mãe, você pode acessar esses métodos via super
.
Certo? Qualquer coisa estou à disposição!
Espero ter ajudado, bons estudos!