Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Andre Summers

Método de uma classe chamando outro método

Recommended Posts

Eu queria saber como faço pra chamar um método de uma classe dentro de outro método da mesma...

 

Estou desenvolvendo uma barra de rolagem em javascript e em determinada parte do codigo eu preciso chamar um metodo que eu ja escrevi mas não estou conseguindo...

 

Exemplo:

 

CODE

 

this.metodo1 = function(){

alert('funcionou');

}

 

this.metodo2 = function(){

var layer = document.createElement('LAYER');

layer.innerHTML="<img src='imagem.jpg' onclick='this.metodo1();'>";

document.appendChild(layer);

}

 

 

o que eu quero eh mais ou menos isso que esta ai em cima... só que da erro...

alguem pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Altera este metodo de :

this.metodo2 = function(){
var layer = document.createElement('LAYER');
layer.innerHTML="<img src='imagem.jpg' onclick='this.metodo1();'>";
document.appendChild(layer);
}

para:

this.metodo2 = function(){
var layer = document.createElement('DIV');
var img = document.createElement('IMG');
	img.src='imagem.jpg';
	img.onclick = this.metodo1;

layer.appendChild(img);
document.appendChild(layer);
}

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fiz isso que você falou e funcionou...

 

Notei que você não usou parenteses após a chamar da função...

 

No meu caso, que estou fazendo uma barra de rolagem... preciso passar parametros para essa função, você poderia me explicar como fazer isso com passagem de parametros??

Compartilhar este post


Link para o post
Compartilhar em outros sites

André boa tarde!

 

Repassei a propriedade onclick apenas a referencia a metódo metodo1, se tivesse incluido parenteses a função seria executada e o retorno anexado a propriedade.

 

Que valores você pretende passar para esta função? Aparti de que?

 

Uma solução para o seu problema seria usando uma função anônima, olhe:

 

this.metodo2 = function(param){

var layer = document.createElement('DIV');

var img = document.createElement('IMG');

img.src='imagem.jpg';

img.onclick = function(){

this.metodo1(param);

};

 

layer.appendChild(img);

document.appendChild(layer);

}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa... obrigado pela atenção!!

 

Eu vou passar uma id como parametro da função...

 

Eu notei que se eu fizer isso

 

CODE

this.metodo2 = function(){

var layer = document.createElement('DIV');

var img = document.createElement('IMG');

img.src='imagem.jpg';

img.onclick = this.metodo1('uma_id');

 

a função executa assim que a pagina acaba de carregar... e não quando o usuário clica na imagem (que seria o certo pois esta no onclick da imagem)

 

Estou usando para teste o browser Firefox 3.0.1 .

 

vou tentar usar uma função anônima como você disse...

porém eu acho que declarar a outra funçao ali vai tornar o código um pouco sujo... (veja bem ñ quero ser chato mas na faculdade os professores batem na tecla de sempre deixar o código limpo e facil de outras pessoas entenderem e eu tento usar essa idéia aqui no meu trabalho).

 

Bom vou testar e volto aqui pra dar o resultado... e deixo a pergunta para saber se é realmente impossivel chamar o metodo dentro do outro metodo de uma maneira mais elegante, como aquela que você mostrou no seu primeiro post (em que os métodos são declarados independentementes), porém com passagem de parametros???

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom... eu fiz como você falou usando a função anonima...

 

e ñ deu certo... esteticamente ficou perfeito (depois que eu reparei q a função declarada foi só para chamar o método.. ou seja os métodos foram declarados independentementes , desculpe a falta de atençao)

 

esse é o erro que dá:

"Exception: this.metodo1 is not a function File: caminho_do_arquivo"

 

tenho a ligeira impressão que o erro deve estar no uso da palavra "this"...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Andre Summers,

Seu código já esta sujo só pelo fato de você usar this que, em javascript, dependendo do escopo da função pode ser referencia a qualquer objeto.

 

*O mais indicado seria anexar as novas propriedades através da propriedade prototype.

 

No exemplo que passei, o evento onclick exige que seja passada uma referencia a uma função(uma espécie de delegate), usei um recurso da linguagem poderoso chamado closure.

 

Acho esta solução elegante, tanto que ela é usada em várias libs js (um exemplo é uma função utilitária chamda createCallback da Extjs link http://extjs.com/deploy/ext/docs/output/Fu...createCallback)

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom...

 

eu uso o this pq foi assim que eu aprendi a usar o conceito de orientação a objeto na linguagem javascript...

 

no caso eu acho que o this equivaleria ao private... e o var seria o public da orientação a objeto...

 

Ok...

 

então como devo declarar os métodos para que eu possa fazer referencia a um metodo dentro de outro método (ambos da mesma classe) ??

Compartilhar este post


Link para o post
Compartilhar em outros sites

this é uma palavra reservada que sempre faz referencia ao escopo de execuçao.

 

Olha isso:

 

function myClass(){
	this.myProperty = 'ola OOP';
}

Se você chamar assim:

 

myClass();
//myProperty será anexado ao objeto window
alert(window.myProperty);

Se você chamar assim:

 

var myObj = new myClass();
//myProperty será anexada ao novo objeto que foi criado (myObj)
alert(myObj.myProperty);

 

Veja este exemplo também:

 

var foo = {};
//Alterei o escopo da funcao para o objeto foo
bar = myClass().call(foo);
alert(foo.myProperty);

entendeu?

 

O certo seria:

 

function myClass(){
//Não estou mais dependente do escopo da função
	myClass.prototype.myProperty = 'ola OOP';
}

Se tiver mais dúvidas, estou a disposição.

Compartilhar este post


Link para o post
Compartilhar em outros sites

hmm...

 

acabei de migrar aqui a classe inteira pra esse jeito que você falou...

 

realmente funcionou perfeitamente ... pra quem estiver acompanhando a conversa a declaração da classe fica assim:

 

CODE

classe.prototype.metodo1 = function(param){

alert(param);

}

 

classe.prototype.metodo2 = function(){

var layer = document.createElement('LAYER');

var img = document.createElement('IMG');

img.src='imagem.jpg';

img.onclick=function(){

classe.prototype.metodo1(param);

}

layer.appendChild(img);

document.appendChild(layer);

}

 

Pronto ... problema resolvido...

 

tenho uma duvida de como fica o encapsulamento declarando a classe desse jeito...

os metodos serão publics ou privates ??(bom eh só uma duvida msm)

 

você tem algum link que explique a orientação a objeto em javascript desse modo que você explicou...

na internet acha-se muitas explicações usando o método que eu usava até então...

se puder disponibilizar um link eu agradeço... (ñ importa se for em inglês)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.