Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Uso do super()

O super() serve para eu pegar o construtor da minha classe pai. No video os professores passam como argumento do super nome, email, cpf e saldo para pegar essas propriedades da classe pai super(nome, email, cpf, saldo) Mas como todas as propriedades da classe pai estão sendo pegas não poderia passar o super sem argumentos ? super() Ja havia visto assim no Game Maker Statio que também utiliza OO.

Esse é meu teste q funcionou (estava testando com base no exemplo da documentação)

class Poligono {
   constructor(height, width) {
      this.name = "Poligono";
      this.height = height;
      this.width = width;
   }

   getName() {
      console.log(`Olá eu sou um ${this.name}`);
   }

   static getNameHeranca() {
      console.log("Herdado da classe Poligono")
   }
}

class Quadrado extends Poligono {
   constructor(altura,largura) {
      super();
      this.altura = altura;
      this.largura = largura;
      this.area = this.largura * this.altura;
      this.name = "Quadrado";
   }

   getArea() {
      console.log(this.area);
   }

   static getNameClass() {
      console.log("Eu sou a classe Quadrado")
   }

}

const a = new Quadrado(30, 20);
Quadrado.getNameHeranca();

Uma ultima dúvida é sobre os nome dos parametros passados no super, ele deve ter o mesmo nome das propriedades da classe pai? Por exemplo:

class class Pessoa {
   constructor(nome, idade, sexo) {
      this.nome = nome;
      this.idade = idade;
      this.sexo = sexo;
   }
}

class Matheus extends Pessoa {
   constructor(sobrenome) {
      super(nome, idade);  //Os parametros devem ser os mesmos da classe pai ou posso colocar um nome generico?
      this.sobrenome = sobrenome;
   }
}
1 resposta
solução!

Boa tarde Matheus, tudo certo?

Primeiramente gostaria de parabenizá-lo por deixar sua dúvida de forma muito clara e bem explicada, o seu exemplo foi ótimo e isolou bem o ponto da discussão. Vou tentar dar uma resposta à altura:

O super() é um método especial que chama o construtor do método de onde você herdou a classe. Ou seja, é uma forma de aproveitar o que já foi estabelecido como um padrão para instanciar um objeto novo. Pode parecer algo trivial nos exemplos iniciais, pois o construtor apenas atribui 2 parâmetros à atributos do objeto, mas imagine classes mais elaboradas onde outros métodos precisem ser invocados e tenham manipulações mais complexas: você não vai querer ficar copiando e colando o conteúdo de construtores ou lembrando de implementar construtores similares aos de onde você os herdou.

Então é aí que entra a praticidade e utilidade do super(), basta você passar os parâmetros e ele vai cuidar dos recursos já estabelecidos da criação desse objeto. E depois de utilizar esse método especial você ainda pode colocar recursos extras no seu novo construtor.

Outro benefício que o super() te dá é a possibilidade de herdar de uma classe sem precisar conhecer exatamente como é a implementação do construtor dela, pois você já sabe que se utilizar o construtor da classe aquele código já deve funcionar como esperado, então ganhamos uma camada de abstração dessa forma.

Sobre a questão dos nomes nos parâmetros do construtor e do super() e se eles precisam ser iguais: A resposta é não. Para o JavaScript, apenas o que importa é a ordem dos parâmetros. Ou seja, o primeiro parâmetro que você passar será utilizado como o primeiro parâmetro do construtor, independente de seu nome, e assim por diante. Porém, lembre-se que as variáveis ou parâmetros precisam estar definidas ali para serem passadas. Considerando o seu exemplo:

class class Pessoa {
   constructor(nome, idade, sexo) {
      this.nome = nome;
      this.idade = idade;
      this.sexo = sexo;
   }
}

class Matheus extends Pessoa {
   constructor(nomeDiferente, algumaIdade, meuSobrenome) {
      super(nomeDiferente, algumaIdade);  //As variáveis têm nomes diferentes da classe pai, mas funcionam como uma função normalmente.
      // Cuidado: como não foi passado um terceiro parâmetro, o atributo 'sexo' dos objetos instanciados terão seu conteúdo como "undefined"
      this.sobrenome = meuSobrenome;
   }
}

Espero ter contribuído. Questionamentos como esses são uma ótima demonstração da capacidade de comunicação e verbalização dos nossos pensamentos e raciocínios, então continue assim pois essa é uma excelente forma de exercitar o que estamos aprendendo.

Bons estudos!