Ir para conteúdo

POWERED BY:

Arquivado

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

brunocampos_

Sobrescrever function

Recommended Posts

Opas,

 

Alguém sabe como eu faço para alterar o modo como o javascript chama as funções?

Por exemplo, eu preciso que antes de qualquer função chamada, uma outra seja rodada, para por exemplo criar um callstack.

 

Seria algo do tipo:

function Z() {
	//Codigo Z
}


function a() {
   //Codigo a
}
function b() {
   //Codigo b
}
function c() {
   b();
}

Eu quero que quando eu chame qualquer função, no caso a, b ou c, a função Z() seja chamada antes de executar o código.

E se for possível também, conseguir montar um callstack com base nisto(quando chamo c, montar um stack c->b, sabendo que b foi chamado de c).

 

Ainda não tentei nada, mas se conseguir posto aqui. Vou começar tentando alterar prototype de function.

 

Any ideas???

Compartilhar este post


Link para o post
Compartilhar em outros sites

andreia_sp, não é isto.

Eu quero sobrescrever o modo como o javascript chama funções de alguma maneira, para sempre chamar uma função Z().

 

Desta maneira, qualquer função declarada em um escopo com esta prerrogativa, quando chamada, irá chamar Z() também.

 

Vamos supor que este meu código que faça isto e a função Z() estejam em um arquivo debugger.js.

Em todo lugar que eu adicionar o script debugger.js, as funções passarão automaticamente a chamar Z() antes de executarem seus códigos. E se possível queria também tentar montar um callstack com isto. Uma maneira seria chamando Z'() no final das funções. Dependendo da solução o callstack fica simples de implementar, mas não consegui ainda uma maneira de alterar esta chamada de todas as funções.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Até agora consegui montar um stack:

 

function b() {
		alert("b");
		c(2);
	}
	
	function c(v) {
		alert(getStack(c));
	}
	
	function getStack(fn) {
		var stack = [];
		do {
			stack.push(fn);
			fn = fn.caller;
		} while(fn);
		return stack;
	}

Mas no ie não consigo pegar o nome da função pelo fn.name, então pego o nome pelo texto da função mesmo, e os argumentos passados pelo fn.arguments.

 

Agora sobrescrever o function ta difícil. Acho que declarando as funções pelo objeto Function

ex:

a = new Function("a", "alert(a);");
seja mais fácil, porém é muito ruim desta maneira.

Já alterei o prototype de Function e Object e até agora nada... :(

 

Alguma sugestão?

Alguém sabe como o function funciona? Como eu consigo chegar no objeto responsável por ele?

 

 

---

EDIT:

 

Estou tentando pegar todos os métodos disponíveis no objeto window, pois todas as funções declaradas vão para lá.

Porém ainda não consegui isto. Alguém sabe?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bruno, bom dia tudo bem?

Eu acho que o hack que você informou(usar o objeto Function para reescrever as funções) deva ser a única opção para fazer o que você deseja, confesso que a algum tempo atrás vi um script que fazia exatamente o que você deseja, mas não me interessei em estudar como ele o fazia.

Procurei na internet e agora não consegui encontra-lo <_<

 

Sobre:

Estou tentando pegar todos os métodos disponíveis no objeto window, pois todas as funções declaradas vão para lá.

Porém ainda não consegui isto. Alguém sabe?

E as innerFunctions? Como você pensa em pega-las?

 

Vou fazer algumas consultas, se descobrir algo posto aqui para tentar te ajudar.

 

Abraços,

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa!

 

Obrigado pela resposta! Pooxa estou atrás de algo assim mas não vi nada parecido ainda. Mas é bom saber que pelo menos tem solução!

Sobre alterar o Function, para mim será ruim pois não declaro as funções desta maneira, mas já é um começo.

 

 

Sobre as innerFunctions...

A princípio é para uso próprio, então na atual arquitetura que uso, eu consigo pegar as innerFunctions como se fossem propriedades

for(fn in majorFunction) {
  //fn == innerFunction
}
O maior problema é pegar as funções de window..

Mas a solução para pegar tudo de window deve pegar innerFunctions em qualquer situação também(a partir de objetos functions).

 

 

 

O melhor mesmo seria alterar o modo como function é declarado ou chamado, assim funções declaradas dinamicamente entrariam no meio também, porém enquanto não acho isto tento ir por outros caminhos.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não poderia fazer assim?

function Z() {
	//Codigo Z
}

function a() {
	Z();
   //Codigo a
}
function b() {
	Z();
   //Codigo b
}
function c() {
	Z();
   b();
}
Eu sei que você quer algo de captura dinamica, mas é meio dificil to vendo outras alternativas ;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Opa, assim não da mesmo, eu estava tentando algo onde eu poderia setar dinamicamente funções a serem sempre chamadas.

Aí por exemplo, se eu incluir o script X na página e ele faz com que as funções do js mudem o comportamento, toda função chamada na página com este script teria o comportamento esperado por ele.

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.