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

Como acessar as propriedades deste (this) objeto literal através de outra propriedade deste mesmo objeto

Segue a função que retorna um objeto paciente:

function obtemPacienteDoFormulario(form) {
    var paciente = {
        "nome": form.nome.value,
        "peso": form.peso.value,
        "altura": form.altura.value,
        "gordura": form.gordura.value,
        "imc": calculaImc(form.peso.value, form.altura.value)
    };
    return paciente;
}

A minha dúvida é a seguinte: por que é necessário utilizar form.peso.value e form.altura.value como parâmetros para a função calculaImc?

Não seria bem mais simples utilizar as próprias propriedades do objeto? Algo como:

"imc": calculaImc(peso, altura)

ou até:

"imc": calculaImc(this.peso, this.altura)

Entretanto isto não é possível, sabem explicar por quê? Há alguma outra maneira de fazer isto com um objeto literal?

2 respostas
solução!

Nao da pra fazer isso no objeto literal mesmo. Isso porque vc ainda esta declarando o objeto nessa sintaxe de {} e o this nao existe ainda.

Vc precisa ou jogar isso pra fora do literal ou usar funcao de alguma forma.

Pra fora:

    var paciente = {
        "nome": form.nome.value,
        "peso": form.peso.value,
        "altura": form.altura.value,
        "gordura": form.gordura.value
    };
    paciente.imc = calculaImc(paciente.peso, paciente.altura);

Ou faz algum tipo de funcao inicializadora e chama ela depois do objeto ser declarado:

    var paciente = {
        "nome": form.nome.value,
        "peso": form.peso.value,
        "altura": form.altura.value,
        "gordura": form.gordura.value,
        init: function() {
            this.imc = calculaImc(this.peso, this.altura);
        }
    };
    paciente.init();

Ou voce pode usar a sintaxe de getter do ES5 pra declarar uma propriedade que na verdade é uma funcao. E ai como ela vai ser chamada só depois, o this existe:

    var paciente = {
        "nome": form.nome.value,
        "peso": form.peso.value,
        "altura": form.altura.value,
        "gordura": form.gordura.value,
        get imc () {
            return calculaImc(this.peso, this.altura);
        }
    };

    // vc chama como uma propriedade normal
    console.log(paciente.imc);

Sérgio, obrigado!

Gostei principalmente da última dica.