Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Dúvida comando Super

A classe super pelo que entendi, herda comandos da classe Pai. Estou estudando e fiz algumas classes para estudar: Usuario.js | IMC.js

Usuario.js

export class Usuario {

    constructor(nome,peso,sexo,altura){
        this._nome = nome;
        this._peso = peso;
        this._sexo = sexo;
        this._altura = altura;
    }

    get Imc(){
        //calculado dividindo o peso (em kg) pela altura ao quadrado
        let imc = this._peso / Math.pow(this._altura, 2);

        return imc;

    }
    get Nome(){

        return this._nome;

    }
    get Peso(){

        return this._peso;

    }
    get Sexo(){

        return this._sexo;

    }
    get Altura(){

        return this._altura;

    }   
}

IMC.js

import { Usuario } from "./Usuario.js";



export class IMC extends Usuario{
    constructor(imc){
        super(nome,peso,sexo,altura);

    }

    StatusIMC(){
         let x = super.Imc;

         if(x < 18.5){
            return "Abaixo do peso";
         }
         if(x >= 18.5 && x <= 24.9){
            return "Peso normal";
         }else {
             return "sobrepeso";
         }
    }
}

Notem que usei o super no ICM.js para "herdar" do pai o get.IMC para "retornar" o valor e jogar na condicional do StatusIMC.

Index.js

Acontece que quando executo o Index.js ele retorna o console.log(Usuario01.StatusIMC) como undefined.

import {Usuario} from "./Usuario.js"


//Usuario(nome,peso,sexo,altura);
let Usuario01 = new Usuario("Vinicius","70","Masculino",1.78);

console.log("Dados clínicos");
console.log("\n Peso = " + Usuario01.Nome);
console.log("\n Peso = "+ Usuario01.Peso);
console.log("\n Sexo = "+ Usuario01.Sexo);
console.log("\n Altura = "+ Usuario01.Altura);
console.log("\n IMC = "+Usuario01.Imc);


console.log(Usuario01.StatusIMC);

Deu para entender mais ou menos ? Eu queria herdar o valor do get IMC da classe Pai Usuario.js, e fazer jogar na classe filha IMC.js para retornar determinada condição.. Mas não deu certo

2 respostas
solução!

Olá Roberto, tudo bem?

Acredito que houve algumas confusões, então vou ir por partes:

  1. Herança e Super

Quando fazemos: Extends Usuario já estamos herdando todos os atributos e métodos dela

Na verdade o super() é utilizado para executar o construtor da classe mãe, ou seja, para popular os dados, e nisso temos outro problema:

    constructor(nome,peso,sexo,altura){
        this._nome = nome;
        this._peso = peso;
        this._sexo = sexo;
        this._altura = altura;
    }

O nosso construtor da classe mãe recebe 4 atributos, e na classe filha você está passando apenas 1:

    constructor(imc){
        super(nome,peso,sexo,altura);

    }

Aqui o que você esta fazendo é recebendo um valor chamado imc e passando nome, peso, sexo, altura, e nenhum desses atributos existem no momento, então teoricamente o que você está fazendo é :

super(undefined, undefined, undefined, undefined)

E ai quando você faz let x = super.Imc; vai dar erro, pois não temos os valores

Deveria ser dessa forma:

  constructor(nome, peso, sexo, altura){
        super(nome,peso,sexo,altura);
  }

Ou seja, recebemos tudo que precisamos, e chamamos o super para popular os atributos da classe mãe, mas reforço que os métodos como o get imc já existem apenas por fazer o extends

  1. Tipo de Instância
let Usuario01 = new Usuario("Vinicius","70","Masculino",1.78);

Aqui você está instanciando um objeto da classe usuário, e essa classe não tem o método statusImc:

console.log(Usuario01.StatusIMC);

Quem tem isso na verdade é a classe IMC, então corrigindo o passo 1, na verdade isso era para ser:

let usuario = new IMC("Vinicius","70","Masculino",1.78)

AI sim, a classe imc de fato contém o StatusIMC e na verdade está faltando o get caso contrário você só conseguirá acessar comousuario.StatusIMC()

  1. Padrão da Linguagem

Isso daqui não é bem um erro, mas é apenas uma dica, em Javascript não utilizamos PascalCase, na verdade utiliza o camelCase por convenção, então no caso era para todos atributos, sejam eles um getter, setter ou uma função ser da seguinte maneira:

get imc(){
    [....]
}
get peso(){
    [....]
}
get altura(){
    [....]
}
get statusImc(){
    [....]
}

Conseguiu Compreender?

Qualquer coisa estou à disposição :)

Maravilha, no final das contas eu nem precisava usar o construtor já que estou estendendo a classe... No caso, a vantagem do Super seria a sobrescrita dos dados do construtor por outros