<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Danilo Trindade &#187; Delegate</title>
	<atom:link href="http://danilotrindade.com.br/tag/delegate/feed/" rel="self" type="application/rss+xml" />
	<link>http://danilotrindade.com.br</link>
	<description>Javascript, Php e o que der na telha...</description>
	<lastBuildDate>Wed, 15 Dec 2010 13:15:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Solução alternativa do Delegate</title>
		<link>http://danilotrindade.com.br/solucao-alternativa-do-delegate/</link>
		<comments>http://danilotrindade.com.br/solucao-alternativa-do-delegate/#comments</comments>
		<pubDate>Mon, 29 Dec 2008 13:29:29 +0000</pubDate>
		<dc:creator>Chapolin</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Orientação a objetos]]></category>
		<category><![CDATA[Classes]]></category>
		<category><![CDATA[Contexto]]></category>
		<category><![CDATA[Delegate]]></category>
		<category><![CDATA[Escopo]]></category>
		<category><![CDATA[Função]]></category>
		<category><![CDATA[Objetos]]></category>
		<category><![CDATA[Orientado]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Utilidade pública]]></category>

		<guid isPermaLink="false">http://danilotrindade.com.br/?p=15</guid>
		<description><![CDATA[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 [...]]]></description>
			<content:encoded><![CDATA[<p>Em muitos casos que postei aqui e também em situações profissionais usei o <span style="color: #ffcc00;"><strong><a title="Classe Delegate" href="http://danilotrindade.com.br/classe-delegate/">Delegate</a></strong></span> (post anterior) e simplesmente ele resolveu vários problenas quando estava trabalhando com classes e perdia o escopo do objeto em alguns métodos.</p>
<p>A pouco, desenvolvendo uma nova classe, me deparei com um problema chato.</p>
<p><span style="color: rgb(51, 51, 51);"><strong>Seguem as Situações:</strong></span></p>
<p>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:</p>
<p><span style="color: rgb(51, 51, 51);"><strong>Situação 1:</strong></span></p>
<pre class="syntax-highlight:javascript">
...
this.iniciar = function() {
    document.onmousemove = this.verifica;
}

this.verifica = function(e) {
    // Tenho o evento mas não tenho o escopo
}
...
</pre>
<p><span style="color: rgb(51, 51, 51);"><strong>Situação 2:</strong></span></p>
<pre class="syntax-highlight:javascript">
...
this.iniciar = function() {
    document.onmousemove = Delegate.create(this, this.verifica, Array(&#039;&#039;));
}

this.verifica = function(e) {
    // Tenho o escopo mas não tenho o evento
}
...
</pre>
<p><span style="color: rgb(51, 51, 51);"><strong>Consegui resolver o problema da seguinte maneira:</strong></span></p>
<pre class="syntax-highlight:javascript">
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(&#039;Estou no escopo&#039;);
        }
        ...
    }
};
</pre>
<p>Imaginei que usando o with poderia ser uma luz e não acreditei que isso funcionaria até testar!!!</p>
<p><span style="color: rgb(51, 51, 51);"><strong>Obs.:</strong></span><br />
- 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].<br />
- 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!</p>
<p>Abs,<br />
Chapooo!</p>
]]></content:encoded>
			<wfw:commentRss>http://danilotrindade.com.br/solucao-alternativa-do-delegate/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Classe Delegate</title>
		<link>http://danilotrindade.com.br/classe-delegate/</link>
		<comments>http://danilotrindade.com.br/classe-delegate/#comments</comments>
		<pubDate>Thu, 18 Dec 2008 15:15:02 +0000</pubDate>
		<dc:creator>Chapolin</dc:creator>
				<category><![CDATA[Javascript]]></category>
		<category><![CDATA[Orientação a objetos]]></category>
		<category><![CDATA[Utilidade pública]]></category>
		<category><![CDATA[Classes]]></category>
		<category><![CDATA[Contexto]]></category>
		<category><![CDATA[Delegate]]></category>
		<category><![CDATA[Escopo]]></category>
		<category><![CDATA[Função]]></category>
		<category><![CDATA[Objetos]]></category>
		<category><![CDATA[Orientado]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://danilotrindade.com.br/?p=14</guid>
		<description><![CDATA[Caros,
Quando você está programando em Javascript Orientado a Objetos, você pode se deparar com diversos problemas e um deles é a perda de escopo do objeto (this). Uma solução simples é usar a classe Delegate, em poucas palavras ela executa uma função/método no contexto do objeto original.
Segue a classe abaixo:

// No Google...  - Estático
Delegate [...]]]></description>
			<content:encoded><![CDATA[<p>Caros,</p>
<p>Quando você está programando em Javascript Orientado a Objetos, você pode se deparar com diversos problemas e um deles é a perda de escopo do objeto (this). Uma solução simples é usar a classe <em><strong>Delegate</strong></em>, em poucas palavras ela executa uma função/método no contexto do objeto original.</p>
<p><span style="color: #333333;"><strong>Segue a classe abaixo:</strong></span></p>
<pre class="syntax-highlight:javascript">
// No Google...  - Estático
Delegate = {
    versao: &quot;1.0&quot;
}

Delegate.create = function(obj, func, args) {
    f = function() {
        var target = arguments.callee.target;
        var func   = arguments.callee.func;
        var args   = arguments.callee.args;

        return func.apply(target, (args.length &lt; 1 ? arguments : args));
    };

    f.args = (args != undefined &amp;&amp; args.length &gt; 0 ? args : new Array());
    f.target = obj;
    f.func = func;

    return f;
}
</pre>
<p><span style="color: #333333;"><strong>Outra forma bacana e mais simples que achei:</strong></span></p>
<pre class="syntax-highlight:javascript">
Delegate = {
	create: function (obj, func, params) {
		var f = function() { return func.apply(obj, params); };

		return f;
	}
}
</pre>
<p><span style="color: #333333;"><strong>Exemplo da implementação:</strong></span></p>
<pre class="syntax-highlight:javascript">
...
this.a = function() {
// Não chame a função this.b() desta forma,
// pois ela executará antes do tempo correto
	setTimeout(Delegate.create(this, this.b, Array(&#039;&#039;)), 1000);
}

this.b = function() {
	alert(this.c());
}

this.c = function() {
	return &#039;Olá&#039;;
}
...
</pre>
<p>Essa classe me quebrou vários galhos.</p>
<p>Abs,<br />
Chapoo</p>
]]></content:encoded>
			<wfw:commentRss>http://danilotrindade.com.br/classe-delegate/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>

