Pesquisa personalizada

Solução alternativa do Delegate

29/12/2008 - 10:29 7 comentários

Em muitos casos que postei aqui e também em situações profissionais usei o Delegate (post anterior) e simplesmente ele resolveu vários problenas quando estava trabalhando com classes e perdia o escopo do objeto em alguns métodos.

A pouco, desenvolvendo uma nova classe, me deparei com um problema chato.

Seguem as Situações:

Tinha numa classe, no método [this.iniciar] um código que seria executado quando um evento ocorresse, mas ao passar o método para o evento, das duas uma: Ou Conseguia pegar o evento e o escopo era perdido (situação 1) ou tinha o escopo (usando o Delegate) porém não tinha o evento :( (situação 2). Segue abaixo os exemplos:

Situação 1:

...
this.iniciar = function() {
    document.onmousemove = this.verifica;
}

this.verifica = function(e) {
    // Tenho o evento mas não tenho o escopo
}
...

Situação 2:

...
this.iniciar = function() {
    document.onmousemove = Delegate.create(this, this.verifica, Array(''));
}

this.verifica = function(e) {
    // Tenho o escopo mas não tenho o evento
}
...

Consegui resolver o problema da seguinte maneira:

NomeDaClasse = function() {
    with(this) {
        ...
        this.iniciar = function() {
            document.onmousemove = this.verifica;
        }

        this.verifica = function(e) {
            // Tenho o evento
            // Tenho o escopo
            teste(); // Não use o this.teste();
        }

        this.teste = function() {
            alert('Estou no escopo');
        }
        ...
    }
};

Imaginei que usando o with poderia ser uma luz e não acreditei que isso funcionaria até testar!!!

Obs.:
- No exemplo acima, se você usar o [this] dentro do evento, ou seja, dentro do método [this.verifica] você estará no escopo do objeto [document].
- Se você tiver uma função fora da classe com o nome idêntico de algum método da classe não vai dar conflito, porém você não vai acessar a função externa também!

Abs,
Chapooo!

Autor: Chapolin - Categoria(s): Javascript, Orientação a objetos Tags: , , , , , , , , , ,

7 comentários para "Solução alternativa do Delegate"

  1. 14/04/2009 - 12:16 Enviado por: Leandro Lemos

    self != _self

  2. 07/01/2009 - 13:35 Enviado por: Chapolin

    Le,

    Sua sugestão funciona e pode ser seguida!

    Só uma observação para quem for usar, não usar o nome da variável “self” ou qualquer outra que se refirar a uma propriedade global.

    Abs,
    Danilo

  3. 03/01/2009 - 22:19 Enviado por: Danilo Trindade

    Le…

    Então… pensei em algo parecido… tipo criar um atributo qualquer e guardar temporariamente, como: “document.objeto = this”…

    …mas o problema é que se usar mais de uma instância do objeto ai ferrou!

    Agora, o problema de usar funções com mesmo nome de métodos da classes acho mais dificil acontecer, apenas deixei claro o comportamento!

    Abs,
    Danilo

  4. 03/01/2009 - 22:12 Enviado por: Leandro Lemos

    Ps.: o blog ta ficando BÃO….

  5. 03/01/2009 - 22:12 Enviado por: Leandro Lemos

    Eai Danilão… blz velho???

    Cara, uma sugestão, ao invés do with que, como vc mencionou pode atrapalhar se vc tiver um método com mesmo nome, tente dentro da classe definir a váriavel “_self = this” e dentro do método vc chama _self.teste();

    Depois me fala o que achou rs…

    Abraçosssss e sucesso…

  6. 02/01/2009 - 12:53 Enviado por: Danilo Trindade

    Leo,

    Primeiramente… Saudades manooo!

    Segundo… A primeira observação vai acontecer sempre que usar um evento ou funções de timeout, por exemplo (on… = function…) o [this] (dentro deste evento) será sempre o escopo do objeto (document, window, body, div, span e etc), porém se quiser acessar qualquer método da classe basta invocá-lo sem a instrução [this].

    A segunda observação é apenas um lembrete, pois normalmente os métodos de uma classe são nomeados de uma forma bem sugestiva não creio que serão criadas funções externas de mesmo nome.

    Abs,
    Danilo

  7. 02/01/2009 - 02:39 Enviado por: Leonardo DNA

    A dúvida que ficou é: Quando acontecem as duas situações -problema? Tem alguma regra, ou acontece em alguma situação específica? =S

Deixe um comentário