1
resposta

Duvida sobre "super"

Não consegui entender direito quando usar "super", alguem consegue me ajudar?

1 resposta

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!