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

Dúvida sobre Funções com comportamento.

Cheguei a resolver o desafio proposto pelo instrutor de criar uma função responsável por montar os objetos do tipo paciente, mas ainda continuei com uma dúvida.

Resolvi o problema da seguinte forma:

" var pacientes = document.getElementsByClassName("paciente");

percorrerArray(pacientes, montaPaciente); "

"function percorrerArray(array, comportamento){ for(var contador = 0; contador <= array.length -1; contador++){ var paciente = comportamento(array[contador]); paciente.imc.textContent = paciente.pegaImc(); } }"

"function montaPaciente(paciente){

var paciente = {nome : paciente.getElementsByClassName("info-nome")[0].textContent, peso : paciente.getElementsByClassName("info-peso")[0].textContent, altura : paciente.getElementsByClassName("info-altura")[0].textContent, imc : paciente.getElementsByClassName("info-imc")[0], pegaImc : function(){ if(this.altura != 0){ var imc = this.peso / (this.altura * this.altura); return imc; }else{ console.log("Altura deve ser maior que zero."); } } } return paciente; }"

A dúvida é por que não consigo calcular o imc na função montaPaciente e atribuir o valor direto no atributo imc, no caso: "this.imc.textContent = this.peso / (this.altura * this.altura". Como não consegui desta maneira fui obrigado a chamar a função anônima de calcular imc dentro da função percorrerArray logo após a linha que monta todo o objeto : "var paciente = comportamento(array[contador]); paciente.imc.textContent = paciente.pegaImc();)"

5 respostas

Li em outras discussões moderadores pedindo para postar o trecho do código entre "", fiz assim mas não mudou nada, vou tentar novamente...

Resolvi o problema da seguinte forma:

" var pacientes = document.getElementsByClassName("paciente");

percorrerArray(pacientes, montaPaciente); "

"function percorrerArray(array, comportamento){ for(var contador = 0; contador <= array.length -1; contador++){ var paciente = comportamento(array[contador]); paciente.imc.textContent = paciente.pegaImc(); } }"

"function montaPaciente(paciente){

var paciente = {nome : paciente.getElementsByClassName("info-nome")[0].textContent, peso : paciente.getElementsByClassName("info-peso")[0].textContent, altura : paciente.getElementsByClassName("info-altura")[0].textContent, imc : paciente.getElementsByClassName("info-imc")[0], pegaImc : function(){ if(this.altura != 0){ var imc = this.peso / (this.altura * this.altura); return imc; }else{ console.log("Altura deve ser maior que zero."); } } } return paciente; }"

A dúvida é por que não consigo calcular o imc na função montaPaciente e atribuir o valor direto no atributo imc, no caso: this.imc.textContent = this.peso / (this.altura * this.altura.

Como não consegui desta maneira fui obrigado a chamar a função anônima de calcular imc dentro da função percorrerArray logo após a linha que monta todo o objeto : var paciente = comportamento(array[contador]); paciente.imc.textContent = paciente.pegaImc();)

Agora vai certo ..


var pacientes = document.getElementsByClassName("paciente");

percorrerArray(pacientes, montaPaciente);

function percorrerArray(array, comportamento){
    for(var contador = 0; contador <= array.length -1; contador++){
           var paciente = comportamento(array[contador]);
           paciente.imc.textContent = paciente.pegaImc();
            }
}

function montaPaciente(paciente){

var paciente = {nome : paciente.getElementsByClassName("info-nome")[0].textContent,
                peso : paciente.getElementsByClassName("info-peso")[0].textContent,
                altura : paciente.getElementsByClassName("info-altura")[0].textContent,
                imc : paciente.getElementsByClassName("info-imc")[0],
                pegaImc : function(){
                          if(this.altura != 0){
                                var imc = this.peso / (this.altura * this.altura); 
                                return imc;
                          }else{
                                console.log("Altura deve ser maior que zero.");
                               }
                          }
               }
    return paciente;
}
solução!

Olá Rodrigo! É possível sim calcular o imc direto na função montaPaciente. Basta por o seu código da seguinte forma:

var pacientes = document.getElementsByClassName("paciente");

percorrerArray(pacientes, montaPaciente);

function percorrerArray(array, comportamento){
    for(var contador = 0; contador <= array.length -1; contador++){
        comportamento(array[contador]);
            }
}

function montaPaciente(paciente){

    var paciente = {nome : paciente.getElementsByClassName("info-nome")[0].textContent,
                    peso : paciente.getElementsByClassName("info-peso")[0].textContent,
                    altura : paciente.getElementsByClassName("info-altura")[0].textContent,
                    imc : paciente.getElementsByClassName("info-imc")[0]
                   }

                   paciente.imc.textContent = paciente.peso / ( paciente.altura * paciente.altura );

}

Só não é possivel calcular dentro do bloco que você monta o objeto paciente. Este:

var paciente = {    nome : paciente.getElementsByClassName("info-nome")[0].textContent,
                    peso : paciente.getElementsByClassName("info-peso")[0].textContent,
                    altura : paciente.getElementsByClassName("info-altura")[0].textContent,
                    imc : paciente.getElementsByClassName("info-imc")[0]
                   }

Para calcular dentro desse bloco, seria necessário você criar uma função, pois objetos são formados por atributos e funções. Atributos são características do objeto enquanto funções são "ações" que ele efetua. No entanto, criando uma função você teria que chama-la para que seja executado o calculo e isso só pode ser feito fora do bloco de código referente ao objeto. Ficaria da seguinte forma:

function montaPaciente(paciente){

    var paciente = {nome : paciente.getElementsByClassName("info-nome")[0].textContent,
                    peso : paciente.getElementsByClassName("info-peso")[0].textContent,
                    altura : paciente.getElementsByClassName("info-altura")[0].textContent,
                    imc : paciente.getElementsByClassName("info-imc")[0],
                    calculaIMC : function() {
                        this.imc.textContent = this.peso / ( this.altura * this.altura );
                    }
                   }
    paciente.calculaIMC();
}

Enfim, espero ter ajudado! Bons Estudos!

Muito obrigado Romário.

Por nada Rodrigo! Estamos aqui para ajudar. Bons Estudos!