Não consegui entender direito quando usar "super", alguem consegue me ajudar?
ATÉ 50% OFF
TÁ ACABANDO!
0 dias
0 horas
0 min
0 seg
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!