Não consegui entender direito quando usar "super", alguem consegue me ajudar?
Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!
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!