1
resposta

Inicialização de atributos objetos JS

Olá pessoal, Percebi que em um dos exemplos foi feita a seguinte implementação:

function obterPacienteDoForm(form) {
    return {
        nome: form.nome.value,
        altura: form.altura.value,
        peso: form.peso.value,
        gordura: form.gordura.value,
        imc: calculaIMCFormatadoTela(form.peso.value, form.altura.value)
    };
}

Como é possível ver, é passado à função de cálculo de IMC, valores oriundos diretamente do form, e não dos próprios atributos do objeto que já receberam esses mesmos valores do form.

Tentei mudar a implementação, apenas como um teste e ficou assim:

function obterPacienteDoForm(form) {
    return {
        nome: form.nome.value,
        altura: form.altura.value,
        peso: form.peso.value,
        gordura: form.gordura.value,
        imc: calculaIMCFormatadoTela(peso, altura)
    };
}

Porém desta forma, o cálculo do IMC resultou em NaN. Tentei converter para Number, utilizando a função Number() antes de passar à função, porém, sem sucesso. Após fazer um console.log() nos dois valores após serem enviados para a função:

function calculaIMCFormatadoTela(peso, altura) {
    console.log(peso);
    console.log(altura);
    return calculateIMC(peso, altura).toFixed(2);
}

Foram logadas as duas tags de input respectivamente.

Daí me pergunto, de qual contexto ele puxou isso?

Posso assumir que objetos javascript não conseguem ser acessados durante sua criação?

Obrigado.

1 resposta

Oi Ítalo, tudo bem? Vamos focar nessa linha que é onde se encontra seu problema:

imc: calculaIMCFormatadoTela(peso, altura)

Primeiro, você esta criando um novo objeto e não existe nenhuma referência local para peso e altura. Quando for calcular o IMC, ele vai tentar somar algo que não foi definido com algo que não foi definido, neste caso, undefined com undefined, que vai resultar em NaN. Not a Number.

Você não pode usar o this neste caso. A referência dele será a própria função. Por isso a captura precisa ser feita direto pelo objeto form.

Entende?