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