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

Por que assim não funciona?!

Criei uma espécie de classe em um arquivo separado de nome pacientes e que recebe como parâmetro um "pacienteTr". Dentro desta "classe", ela tem os atributos e "métodos"(funções anônimas).

Criei também uma função em um arquivo separado, como mostrado no curso, de nome "percorreArray()". Ela recebe dois parâmetros: (array, comportamento). Dentro dela ela executa o "for" e instancia um paciente. O problema é na hora de executar o método do paciente conforme o argumento passado para o parâmetro "comportamento". Da forma que fiz não está dando certo, alguma forma de fazer isso?!

Link para o código abaixo: http://codepen.io/mulleresposito/pen/MJPqvZ

2 respostas
solução!

Oi Muller! Otima pergunta.

Temos dois problemas aqui:

1) Quando vc chama percorreArray(trsPacientes,pegaIMC); isso não é possível porque pegaIMC não está declarada no escopo global. Ela está dentro do seu objeto/classe.

2) E quando vc faz paciente.comportamento() você na verdade está chamando um metodo com nome comportamento - que claro, nao existe, entao da erro.

Existe um jeito simples de resolver isso se lembrarmos que propriedades de um objeto podem ser acessadas com sintaxe de array. Entao na verdade, esses dois codigos fariam a mesma coisa:

paciente.pegaIMC();
paciente['pegaIMC']();

Sabendo disso, que podemos usar uma chave string pra acessar uma propriedade do "array", podemos trabalhar com uma variavel comportamento do tipo String:

paciente[comportamento]();

E na hora de chamar fariamos algo tipo:

percorreArray(trsPacientes, 'pegaIMC');

Um exemplo funcionando: http://codepen.io/sergiolopes/pen/YNRpJL?editors=1010

Mas, claro, isso não é bem trabalhar com funcões como parametro. A gente ta trabalhando com o nome da funcao em string. Mas se funcoes nao fossem cidadas de primeira classe, nao conseguiriamos jamais acessar um ponteiro pra funcao com paciente[comportamento]

Outra opção, mais turbinada, seria criar uma funcão construtora Paciente e definir os metodos no prototype dela. Isso faz com que os metodos sejam acessiveis globalmente pelo prototipo e ai podemos invoca-los usando call ou apply. A diferenca aqui é que não existe manipulacao de strings apenas manipulacao de funcoes mesmo.

http://codepen.io/sergiolopes/pen/pRQNYj?editors=1010

Excelente resposta, muito obrigado!