<?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>JulioGreff.net &#187; poo</title>
	<atom:link href="http://juliogreff.net/tag/poo/feed/" rel="self" type="application/rss+xml" />
	<link>http://juliogreff.net</link>
	<description>A mesma web, um novo estilo de desenvolvimento</description>
	<lastBuildDate>Sat, 07 May 2011 17:07:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>JavaScript Orientado a Objetos &#8211; Parte 3</title>
		<link>http://juliogreff.net/javascript-orientado-a-objetos-parte-3/</link>
		<comments>http://juliogreff.net/javascript-orientado-a-objetos-parte-3/#comments</comments>
		<pubDate>Wed, 20 Feb 2008 18:00:00 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[herança]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://juliogreff.blog.br/javascript-orientado-a-objetos-parte-3/</guid>
		<description><![CDATA[Volto com a terceira parte sobre JavaScript Orientado a Objetos. Então chega de papo e vamos logo ao que interessa. Propriedades Estáticas Propriedades e métodos estáticos são aqueles que podem ser acessados de qualquer lugar do script, sem a necessidade de instanciar a classe. Considera-se que o JavaScript não suporta esse conceito, já que não [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-2/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 2'>JavaScript Orientado a Objetos &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-1/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 1'>JavaScript Orientado a Objetos &#8211; Parte 1</a></li>
<li><a href='http://juliogreff.net/php-orientado-a-objeto/' rel='bookmark' title='Permanent Link: PHP Orientado a Objeto'>PHP Orientado a Objeto</a></li>
<li><a href='http://juliogreff.net/estendendo-objetos-dom/' rel='bookmark' title='Permanent Link: Estendendo Objetos DOM'>Estendendo Objetos DOM</a></li>
<li><a href='http://juliogreff.net/estendendo-o-javascript/' rel='bookmark' title='Permanent Link: Estendendo o JavaScript'>Estendendo o JavaScript</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Volto com a terceira parte sobre JavaScript Orientado a Objetos. Então chega de papo e vamos logo ao que interessa.</p>
<h3>Propriedades Estáticas</h3>
<p>Propriedades e métodos estáticos são aqueles que podem ser acessados de qualquer lugar do script, sem a necessidade de instanciar a classe. Considera-se que o JavaScript não suporta esse conceito, já que não possui classes, mas pode-se também simular.</p>
<p>Funções não deixam de ser objetos, e objetos podem ter propriedades. Veja no exemplo:</p>
<pre xml:space="preserve">
<code>function Person() {  }
        Person.staticMethod = function() { alert("Método Estático"); }
        Person.staticMethod(): // "Método Estático"
        var me = new Person();
        me.staticMethod(); // Retornará erro</code></pre>
<p>Também muito simples, e bem útil em certas ocasiões. Podemos tomar como exemplo a <a href="http://www.mootools.net/" rel="external" title="Mootools Library">Mootools</a>, com o <a href="http://www.juliogreff.blog.br/mootools-classes" title="Mootools - Classes">Class</a> e <code>Class.empty</code>. <code>Class</code> é um construtor, e <code>Class.empty</code> é um método estático.</p>
<h3>Herança</h3>
<p>A herança é outro conceito que o JavaScript não implementa formalmente, necessitando das famosas gambiarras. Quando bem empregada, permite uma grande reutilização de código, criando classes derivadas a partir de uma superclasse (classe-mãe), herdando todas as propriedades.</p>
<p>Existem vários tipos específicos de pessoas, em vários sentidos. Brasileiros, portugueses, americanos, vendedores, médicos, desenvolvedores&#8230; Mesmo sendo mais específicos, todos eles têm características comuns de uma pessoa. Assim, o construtor <code>Brazilian</code> é derivado de <code>Person</code>.</p>
<p>Primeiro, vamos criar os construtores com suas propriedades.</p>
<pre xml:space="preserve">
<code>function Person() {
                this.eyes = 2;
                this.speak = function(message) {
                        alert(message);
                }
        }
        function Brazilian() {
                this.birthCountry = "Brasil";
        }</code></pre>
<p>Pessoas falam, e isso se aplica também aos brasileiros, mas nem todas as pessoas nasceram no Brasil. Assim, a superclasse (ou super-construtor) é <code>Person</code>, e somente nela definimos as propriedades comuns.</p>
<p>Para fazer a herança existem vários métodos, mas vou explicar agora somente o que considero o mais simples e usado. Basta criar uma instância do &#8220;super-construtor&#8221; no protótipo do construtor derivado, assim:</p>
<pre xml:space="preserve">
<code>Brazilian.prototype = new Person;</code></pre>
<p>Todo o construtor <code>Person</code> foi instanciado como parte de <code>Brazilian</code>. Agora podemos criar um objeto <code>Brazilian</code> e utilizar tanto as propriedades específicas (definidas no próprio construtor) quanto as do &#8220;super-construtor&#8221;.</p>
<pre xml:space="preserve">
<code>var me = new Brazilian("Julio Greff");
        alert(me.birthCountry); // "Brasil"
        me.speak("Olá!"); // "Olá!"</code></pre>
<p>Existem outros métodos para herança, mas como já disse ficarão para outra oportunidade. E a série sobre JavaScript Orientado a Objetos se encerra aqui! Qualquer correção ou sugestão será bem vinda, basta comentar! Até!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-2/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 2'>JavaScript Orientado a Objetos &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-1/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 1'>JavaScript Orientado a Objetos &#8211; Parte 1</a></li>
<li><a href='http://juliogreff.net/php-orientado-a-objeto/' rel='bookmark' title='Permanent Link: PHP Orientado a Objeto'>PHP Orientado a Objeto</a></li>
<li><a href='http://juliogreff.net/estendendo-objetos-dom/' rel='bookmark' title='Permanent Link: Estendendo Objetos DOM'>Estendendo Objetos DOM</a></li>
<li><a href='http://juliogreff.net/estendendo-o-javascript/' rel='bookmark' title='Permanent Link: Estendendo o JavaScript'>Estendendo o JavaScript</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/javascript-orientado-a-objetos-parte-3/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>JavaScript Orientado a Objetos &#8211; Parte 2</title>
		<link>http://juliogreff.net/javascript-orientado-a-objetos-parte-2/</link>
		<comments>http://juliogreff.net/javascript-orientado-a-objetos-parte-2/#comments</comments>
		<pubDate>Wed, 20 Feb 2008 01:12:36 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://juliogreff.blog.br/javascript-orientado-a-objetos-parte-2/</guid>
		<description><![CDATA[O JavaScript, apesar de ser usado há muito tempo quase que exclusivamente como linguagem de programação estruturada, também é uma linguagem de programação orientada a objetos poderosa. Nessa segunda parte da série, vamos nos aprofundar um pouco mais nessa técnica de programação. A Propriedade prototype No JavaScript, toda função construtora possui uma propriedade chamada Function.prototype. [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-3/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 3'>JavaScript Orientado a Objetos &#8211; Parte 3</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-1/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 1'>JavaScript Orientado a Objetos &#8211; Parte 1</a></li>
<li><a href='http://juliogreff.net/php-orientado-a-objeto/' rel='bookmark' title='Permanent Link: PHP Orientado a Objeto'>PHP Orientado a Objeto</a></li>
<li><a href='http://juliogreff.net/as-vantagens-de-prototype/' rel='bookmark' title='Permanent Link: As Vantagens de Prototype'>As Vantagens de Prototype</a></li>
<li><a href='http://juliogreff.net/estendendo-objetos-dom/' rel='bookmark' title='Permanent Link: Estendendo Objetos DOM'>Estendendo Objetos DOM</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>O JavaScript, apesar de ser usado há muito tempo quase que exclusivamente como linguagem de programação estruturada, também é uma linguagem de programação orientada a objetos poderosa. Nessa segunda parte da série, vamos nos aprofundar um pouco mais nessa técnica de programação.</p>
<h3>A Propriedade prototype</h3>
<p>No JavaScript, toda função construtora possui uma propriedade chamada <code>Function.prototype</code>. Essa propriedade nos permite adicionar e, em certos casos modificar, propriedades ou métodos de um construtor, após sua definição. Diferente de PHP, por exemplo, podemos adicionar propriedades durante a execução.</p>
<pre xml:space="preserve">
<code>function Person() {}
        var me = new Person();
        alert(me.eyes); // undefined
        Person.prototype.eyes = 2;
        alert(me.eyes); // 2</code></pre>
<p>Como se pode notar, na primeira tentativa não tínhamos a propriedade definida. Após isso, adicionada em tempo de execução, já temos a propriedade definida.</p>
<p>Também há certas exceções na utilidade do <code>Function.prototype</code>. A primeira delas é que essa propriedade não consegue sobrescrever qualquer coisa que já tenha sido definida no construtor. Não podemos definir uma propriedade no construtor e depois mudar seu valor através de <code>Function.prototype</code>.</p>
<pre xml:space="preserve">
<code>function Person() { this.eyes = 2; }
        var me = new Person();
        alert(me.eyes); // 2
        Person.prototype.eyes = 1;
        alert(me.eyes); // 2, continuo tendo 2 olhos</code></pre>
<p>Para resolver esse problema e continuar usando <code>Function.prototype</code>, podemos definir a propriedade fora do construtor usando a técnica, e sobrescrevê-la da mesma maneira.</p>
<pre xml:space="preserve">
<code>function Person() {}
        Person.prototype.eyes = 2;
        var me = new Person();
        alert(me.eyes); // 2
        Person.prototype.eyes = 1;
        alert(me.eyes); // 1</code></pre>
<p>Outro pequeno problema é quando definimos objetos ou arrays através dessa propriedade. Veja:</p>
<pre xml:space="preserve">
<code>function Person() {}
        Person.prototype.uses = ["watch", "glasses"];
        var me = new Person();
        var you = new Person();
        me.uses.push("hat");
        alert(me.uses); // ["watch", "glasses", "hat"]
        alert(you.uses); // ["watch", "glasses", "hat"]</code></pre>
<p>Com base no exemplo, pode-se ver que o array é compartilhado, assim como todos os seus itens. Moral da história: é preferível definir tudo no próprio construtor, ou então definir apenas métodos através de <code>Function.prototype</code>.</p>
<h3>Encapsulamento</h3>
<p>Formalmente, encapsulamento ainda não existe no JavaScript, mas podemos usar esse recurso disfarçado.</p>
<p>Tudo o que criamos dentro de nossos construtores está no escopo público, ou seja, pode ser acessado de dentro do construtor ou do restante do script. Uma maneira de simular variáveis privadas, que só podem ser acessadas de dentro do construtor e por seus métodos, é utilizando o escopo local. Lembra-se de quando falei sobre <a href="http://juliogreff.net/escopo-de-variaveis/" title="Escopo de Variáveis">escopo de variáveis</a>?</p>
<pre xml:space="preserve">
<code>function Person() {
                this.public = "Variável Pública";
                var private = "Variável Privada";
                this.publicMethod = function() {
                        alert(this.public);
                        alert(private);
                }
                var privateMethod = function() {
                        alert(private);
                }
                this.callPrivate = function() {
                        alert(private);
                }
        }
        var me = new Person();
        alert(me.public); // "Variável Pública";
        alert(me.private); // undefined
        me.publicMethod();
        me.privateMethod(); // Retornará erro
        me.callPrivate();</code></pre>
<p>O exemplo acima exemplifica bem de onde cada tipo de variável pode ser acessado. Já o uso de variáveis protegidas (protected) necessitam de mais gambiarras, mas isso fica pra outra vez.</p>
<p>Quanto ao uso de métodos privados só existe um pequeno problema: não é possível acessar propriedades ou métodos públicos diretamente. Para isso, é necessário <a href="http://juliogreff.net/funcoes-em-diferentes-escopos/" title="Funções em Diferentes Escopos">modificar o escopo</a> em que a função executada, através de <code>Function.bind</code> (função user-defined).</p>
<pre xml:space="preserve">
<code>function Person() {
                this.public = "Variável Pública";
                var bindPublic = function() {
                        alert(this.public);
                }.bind(this);
                bindPublic();
        }
        var me = new Person();</code></pre>
<p>Para testar, lembre-se de copiar a função <code>Function.bind</code>!</p>
<p>E a parte 2 se encerra aqui. Volto na <a href="http://juliogreff.net/javascript-orientado-a-objetos-parte-3/" title="JavaScript Orientado a Objetos - Parte 3">parte 3</a> pra falar mais um pouco sobre programação orientada a objetos. Até lá!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-3/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 3'>JavaScript Orientado a Objetos &#8211; Parte 3</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-1/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 1'>JavaScript Orientado a Objetos &#8211; Parte 1</a></li>
<li><a href='http://juliogreff.net/php-orientado-a-objeto/' rel='bookmark' title='Permanent Link: PHP Orientado a Objeto'>PHP Orientado a Objeto</a></li>
<li><a href='http://juliogreff.net/as-vantagens-de-prototype/' rel='bookmark' title='Permanent Link: As Vantagens de Prototype'>As Vantagens de Prototype</a></li>
<li><a href='http://juliogreff.net/estendendo-objetos-dom/' rel='bookmark' title='Permanent Link: Estendendo Objetos DOM'>Estendendo Objetos DOM</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/javascript-orientado-a-objetos-parte-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>JavaScript Orientado a Objetos &#8211; Parte 1</title>
		<link>http://juliogreff.net/javascript-orientado-a-objetos-parte-1/</link>
		<comments>http://juliogreff.net/javascript-orientado-a-objetos-parte-1/#comments</comments>
		<pubDate>Mon, 18 Feb 2008 18:00:38 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://juliogreff.blog.br/javascript-orientado-a-objetos-parte-1/</guid>
		<description><![CDATA[O JavaScript, apesar de ser usado há muito tempo quase que exclusivamente como linguagem de programação estruturada, também é uma linguagem de programação orientada a objetos poderosa. Nessa série &#8211; remodelada &#8211; vou mostrar um pouco sobre o assunto. Depois de muito tempo, resolvi editar essa série e repostá-la aqui. Aprendi um pouco mais sobre [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-3/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 3'>JavaScript Orientado a Objetos &#8211; Parte 3</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-2/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 2'>JavaScript Orientado a Objetos &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/php-orientado-a-objeto/' rel='bookmark' title='Permanent Link: PHP Orientado a Objeto'>PHP Orientado a Objeto</a></li>
<li><a href='http://juliogreff.net/estendendo-objetos-dom/' rel='bookmark' title='Permanent Link: Estendendo Objetos DOM'>Estendendo Objetos DOM</a></li>
<li><a href='http://juliogreff.net/estendendo-o-javascript/' rel='bookmark' title='Permanent Link: Estendendo o JavaScript'>Estendendo o JavaScript</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>O JavaScript, apesar de ser usado há muito tempo quase que exclusivamente como linguagem de programação estruturada, também é uma linguagem de programação orientada a objetos poderosa. Nessa série &ndash; remodelada &ndash; vou mostrar um pouco sobre o assunto.</p>
<p>Depois de muito tempo, resolvi editar essa série e repostá-la aqui. Aprendi um pouco mais sobre o assunto através da prática, corrigi alguns erros &ndash; muito criticados na época &ndash; e adicionei algumas informações que achei pertinentes. Como dá pra ver, o permalink continua o mesmo, e a versão antiga da série já não está mais no ar. Espero que as correções e adições possam esclarecer bem o assunto.</p>
<h3>Alguns Conceitos</h3>
<p>Antes de começarmos a colocar as mãos em código, vamos aprender um pouco de teoria. O JavaScript não é uma linguagem orientada a objetos completamente desenvolvida, e não implementa alguns conceitos nativamente, como herança e variáveis públicas e privadas, dependendo de &#8220;gambiarras&#8221; para sua implementação.</p>
<p>A base da programação orientada a objetos é, logicamente, objetos. Um objeto é uma abstração de algo real (uma mesa, um carro, a janela do navegador, um elemento HTML&#8230;). Esse objeto possui sua própria estrutura de dados, encapsulada em seu próprio escopo. Esses dados podem ser tipos primitivos (Strings, Arrays, Numbers, Booleans&#8230;), funções (as quais chamaremos de métodos, quando dentro dos objetos) e até outros objetos.</p>
<p>Para criarmos um objeto, precisamos da definição de sua estrutura de dados, criada através de uma matriz. Essa matriz é chamada de classe, ou construtor no JavaScript.</p>
<p>De começo creio que é o suficiente. Quando for necessário, explicarei outros conceitos, como encapsulamento, polimorfismo, herança&#8230;</p>
<h3>Criando Construtores</h3>
<p>Em nosso querido JavaScript, um construtor é apenas uma função comum, que é instanciada em uma variável. Essa instância se faz através da palavra-chave <code>new</code>, indicando a criação de um novo objeto.</p>
<pre><code>function Person() {}
	var me = new Person();</code></pre>
<p>A palavra-chave <code>new</code>, entretanto, só é necessária caso quando a função não retorna o objeto recém-criado. Para retorná-lo, usamos a palavra-chave <code>this</code>.</p>
<pre><code>function Person() { return this; }
	var me = Person();</code></pre>
<p>O <code>this</code>, apesar de estar no construtor, refere-se ao próprio objeto. Ele será bem usado mais a frente.</p>
<h3>Definindo Propriedades</h3>
<p>Propriedades, ou atributos, são os dados que ficam encapsulados no escopo do objeto. Como dito mais acima, essas propriedades podem ser tipos primitivos, funções ou outros objetos.</p>
<p>Seguindo a idéia de algo real, toda pessoa tem um nome. Vamos dar um nome à pessoa que &#8220;criamos&#8221;.</p>
<pre><code>var me = new Person();
	me.name = "Julio Greff";</code></pre>
<p>No código acima, definimos um nome apenas ao objeto <code>me</code>. Outros objetos criados a partir de <code>Person</code> não terão a mesma propriedade. Isso é útil em nosso caso, já que somente eu me chamo &#8220;Julio Greff&#8221;, e só você possui seu nome.</p>
<p>A mesma técnica não é tão útil quando precisamos definir uma propriedade para todos os objetos criados a partir de determinado construtor. Já pensou se tivéssemos, por exemplo, que definir o número de olhos para cada pessoa que criarmos? Para evitar retrabalho, definimos as propriedades comuns a todos objetos dentro do construtor.</p>
<pre><code>function Person() {
		this.eyes = 2;
	}</code></pre>
<p>No exemplo, usei <code>this</code> para me referir ao próprio objeto, ou seja, todo objeto criado terá a propriedade <code>eyes</code> igual a 2.</p>
<p>Mesmo definindo uma propriedade comum a todos objetos, podemos modificar alguma propriedade de um objeto em particular sem que os outros sejam afetados. Por exemplo, no caso de um cíclope, caolho ou alguma anomalia genética grave.</p>
<pre><code>var me = new Person();
	var cyclop = new Person();
	cyclop.eyes = 1;
	alert(cyclop.eyes); // 1
	alert(me.eyes); // 2, inalterado</code></pre>
<p>Como você deve ter notado &ndash; ou pelo menos devia &ndash; o acesso às propriedades é feito através do <code>.</code> (ponto), assim como é feita a sua definição.</p>
<p>Desde quando a humanidade é a humanidade, toda pessoa recebe um nome quando nasce. Também pode receber um apelido, uma roupa, ou qualquer outra coisa. Com os objetos acontece algo parecido. Na &#8220;concepção&#8221; de cada objeto, podemos passar parâmetros para a função construtora, assim como faríamos como outra função qualquer. Esses parâmetros podem, mais tarde, vir a se tornarem propriedades do objeto.</p>
<pre><code>function Person(name) {
		this.name = name;
	}</code></pre>
<p>Dessa maneira, quando criamos o objeto, já podemos dar um nome à pessoa, sem a necessidade de fazê-lo depois da criação do objeto.</p>
<h3>Definindo Métodos</h3>
<p>Assim como características (propriedades), pessoas também têm comportamento: andar, falar, comer&#8230; Objetos também têm comportamento, e esses comportamentos são chamados de métodos. Métodos nada mais são do que funções que são executadas no escopo de algum objeto.</p>
<p>Para criarmos métodos, procedemos da mesma forma com que criamos propriedades. Simples, rápido e indolor:</p>
<pre><code>function Person() {
		this.speak = function(message) {
			alert(message);
		}
	}</code></pre>
<p>Para executarmos métodos também procedemos da mesma forma com que acessamos propriedades, com a diferença de que estamos chamando uma função.</p>
<pre><code>me.speak("Olá!"); // "Olá!"</code></pre>
<p>Essa não é a única maneira de criar métodos, mas é a mais simples, mais organizada e mais eficiente. As outras formas usam propriedades apontando para uma função criada normalmente, dentro ou fora do objeto.</p>
<p>Para a parte 1 é o suficiente. Tenha uma boa digestão e logo volto com mais! <a href="http://juliogreff.net/javascript-orientado-a-objetos-parte-2/" title="JavaScript Orientado a Objetos - Parte 2">Até lá</a>!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-3/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 3'>JavaScript Orientado a Objetos &#8211; Parte 3</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-2/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 2'>JavaScript Orientado a Objetos &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/php-orientado-a-objeto/' rel='bookmark' title='Permanent Link: PHP Orientado a Objeto'>PHP Orientado a Objeto</a></li>
<li><a href='http://juliogreff.net/estendendo-objetos-dom/' rel='bookmark' title='Permanent Link: Estendendo Objetos DOM'>Estendendo Objetos DOM</a></li>
<li><a href='http://juliogreff.net/estendendo-o-javascript/' rel='bookmark' title='Permanent Link: Estendendo o JavaScript'>Estendendo o JavaScript</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/javascript-orientado-a-objetos-parte-1/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>Mootools &#8211; Chain</title>
		<link>http://juliogreff.net/mootools-chain/</link>
		<comments>http://juliogreff.net/mootools-chain/#comments</comments>
		<pubDate>Sun, 10 Feb 2008 16:16:13 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[bibliotecas]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[fila]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://www.juliogreff.blog.br/mootools-chain/</guid>
		<description><![CDATA[Executar funções em determinada ordem, como filas de requisições, através de uma classe. Resumindo, é isso o que faz a classe Chain, da Mootools, e nesse post veremos como funciona e também como implementar essa funcionalidade em suas próprias classes. Seqüenciando Funções Para criar uma seqüência de funções, basta instanciar a classe Chain. Após isso, [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/mootools-eventos/' rel='bookmark' title='Permanent Link: Mootools &#8211; Eventos'>Mootools &#8211; Eventos</a></li>
<li><a href='http://juliogreff.net/mootools-classes/' rel='bookmark' title='Permanent Link: Mootools &#8211; Classes'>Mootools &#8211; Classes</a></li>
<li><a href='http://juliogreff.net/mootools-options/' rel='bookmark' title='Permanent Link: Mootools &#8211; Options'>Mootools &#8211; Options</a></li>
<li><a href='http://juliogreff.net/ajax-com-a-mootools/' rel='bookmark' title='Permanent Link: Ajax com a Mootools'>Ajax com a Mootools</a></li>
<li><a href='http://juliogreff.net/funcoes-em-diferentes-escopos/' rel='bookmark' title='Permanent Link: Funções em Diferentes Escopos'>Funções em Diferentes Escopos</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p class="left"><img src="http://juliogreff.net/wp-uploads/chain.jpg" title="Cookies!" alt="Cookies!" /></p>
<p>Executar funções em determinada ordem, como filas de requisições, através de uma classe. Resumindo, é isso o que faz a classe <code>Chain</code>, da <a href="http://www.mootools.net/" rel="external" title="Mootools Library">Mootools</a>, e nesse post veremos como funciona e também como implementar essa funcionalidade em suas próprias classes.</p>
<h3>Seqüenciando Funções</h3>
<p>Para criar uma seqüência de funções, basta instanciar a classe <code>Chain</code>. Após isso, já podemos adicionar funções à seqüência para podermos chamá-la quando necessário.</p>
<p>Adicionamos funções à uma seqüência através do método <code>Chain.chain</code>, passando como parâmetro a função a ser adicionada à seqüência.</p>
<pre><code>var myChain = new Chain();
myChain.chain(function() {
	alert("Primeira Função");
});
myChain.chain(function() {
	alert("Segunda Função");
});</code></pre>
<p>O método <code>Chain.callChain</code> é quem chama a próxima função da seqüência. Quando o método é executado, a função é executada e então removida da seqüência.</p>
<pre><code>myChain.callChain(); // "Primeira Função"
myChain.callChain(); // "Segunda Função"</code></pre>
<p>Caso necessário, podemos limpar todas as funções de nossa seqüência através do método <code>Chain.clearChain</code>.</p>
<h3>Implementando em Classes</h3>
<p>Obviamente, <code>Chain</code> é muito mais útil quando usado dentro de uma função. Classes não deixam de ser uma função, e possuem muito mais poder. É nelas onde a utilização de <code>Chain</code> acontece na própria Mootools.</p>
<p>Após a implementação de <code>Chain</code> em alguma classe, podemos utilizar seus métodos.</p>
<pre><code>var myClass = new Class({
	"initialize": function() {},
	"execute": function() {
		this.callChain();
		if(this.chains.length &gt; 0) this.execute();
	}
});
myClass.implement(new Chain);
var myChain = new myClass();
myChain.chain(function() {
	alert("Primeira Função");
});
myChain.chain(function() {
	alert("Segunda Função");
});
myChain.execute();
</code></pre>
<p>Como no exemplo acima, também podemos utilizar a variável <code>Chain.chains</code>, que é o array que contém todas as funções na seqüência. Não é necessário se preocupar muito com ele, já que a classe faz todo o necessário. O utilizei acima somente para não criar um loop infinito.</p>
<p>Essa classe também já é implementada na utilização de efeitos, para encadear vários efeitos subseqüentes. Também muito útil para se criar uma fila de requisições Ajax, ou algo do gênero. Vou ficando por aqui, até!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/mootools-eventos/' rel='bookmark' title='Permanent Link: Mootools &#8211; Eventos'>Mootools &#8211; Eventos</a></li>
<li><a href='http://juliogreff.net/mootools-classes/' rel='bookmark' title='Permanent Link: Mootools &#8211; Classes'>Mootools &#8211; Classes</a></li>
<li><a href='http://juliogreff.net/mootools-options/' rel='bookmark' title='Permanent Link: Mootools &#8211; Options'>Mootools &#8211; Options</a></li>
<li><a href='http://juliogreff.net/ajax-com-a-mootools/' rel='bookmark' title='Permanent Link: Ajax com a Mootools'>Ajax com a Mootools</a></li>
<li><a href='http://juliogreff.net/funcoes-em-diferentes-escopos/' rel='bookmark' title='Permanent Link: Funções em Diferentes Escopos'>Funções em Diferentes Escopos</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/mootools-chain/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mootools &#8211; Options</title>
		<link>http://juliogreff.net/mootools-options/</link>
		<comments>http://juliogreff.net/mootools-options/#comments</comments>
		<pubDate>Sun, 20 Jan 2008 16:47:44 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[bibliotecas]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[options]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://www.juliogreff.blog.br/mootools-options/</guid>
		<description><![CDATA[Através dos conceitos de reutilização de código, as funções JavaScript de hoje contém opções e mais opções para o usuário definir (ou não). Verificar cada uma dessas opções manualmente dá muito trabalho, mas a Mootools nos ajuda. Vamos ver o suporte dessa incrível biblioteca, através da classe Options. O que faz? A classe Options define [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/mootools-eventos/' rel='bookmark' title='Permanent Link: Mootools &#8211; Eventos'>Mootools &#8211; Eventos</a></li>
<li><a href='http://juliogreff.net/mootools-classes/' rel='bookmark' title='Permanent Link: Mootools &#8211; Classes'>Mootools &#8211; Classes</a></li>
<li><a href='http://juliogreff.net/mootools-chain/' rel='bookmark' title='Permanent Link: Mootools &#8211; Chain'>Mootools &#8211; Chain</a></li>
<li><a href='http://juliogreff.net/ajax-com-a-mootools/' rel='bookmark' title='Permanent Link: Ajax com a Mootools'>Ajax com a Mootools</a></li>
<li><a href='http://juliogreff.net/mootools-menu-sanfona/' rel='bookmark' title='Permanent Link: Mootools &#8211; Menu Sanfona'>Mootools &#8211; Menu Sanfona</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Através dos conceitos de reutilização de código, as funções JavaScript de hoje contém opções e mais opções para o usuário definir (ou não). Verificar cada uma dessas opções manualmente dá muito trabalho, mas a <a href="http://www.mootools.net/" rel="external" title="Mootools Library">Mootools</a> nos ajuda. Vamos ver o suporte dessa incrível biblioteca, através da classe <code>Options</code>.</p>
<h3>O que faz?</h3>
<p>A classe <code>Options</code> define as opções passadas pelo usuário para alguma classe. Essa definição é feita sobrescrevendo os valores padrão (caso esses sejam definidos pelo usuário) e os mantendo quando nenhuma opção correspondente é passada.</p>
<p>Lógico, nada muito espetacular. Isso poderia ser feito através da função <code>$merge</code>, da própria Mootools. Mas há mais que isso. Além de definir opções, a classe <code>Options</code> também vasculha-as em busca de opções que comecem com &#8220;on&#8221;, e automaticamente adicionam-as como um evento, caso a classe <code>Events</code> esteja implementada. É mais que apenas um <code>$merge</code> disfarçado&#8230;</p>
<h3>Implementando</h3>
<p>Mais uma vez, antes de podermos utilizar essa classe extra, devemos implementá-la em nossa classe. Novamente, utilizamos o método <code>Class.implement</code>.</p>
<p>Caso você queira utilizar o suporte a eventos, também implemente a classe <code><a href="http://juliogreff.net/mootools-eventos" title="Mootools - Eventos">Events</a></code>, na mesma declaração.</p>
<pre><code>myClass.implement(new Options, new Events);
</code></pre>
<h3>Definindo Opções</h3>
<p>Antes de tudo, é necessário definir as opções que serão utilizadas por padrão. Essas opções padrão devem estar em <code>this.options</code>, sendo <code>this</code> a nossa classe.</p>
<pre><code>var SlideShow = new Class({
	"options": {
		"slides": [],
		"startSlide": 0
	},
	"initialize": function() {}
});
</code></pre>
<p>Para fazer a &#8220;escolha&#8221; das opções, basta utilizar o método <code>Options.setOptions</code>, levando como parâmetro as opções que devem sobrescrever as opções padrão. Após a chamada ao método, todas as opções estarão disponíveis em <code>this.options</code>. Se o usuário definir opções que não estão definidas como padrão, elas também serão adicionadas.</p>
<pre><code>var SlideShow = new Class({
	"options": {
		"slides": [],
		"startSlide": 0
	},
	"initialize": function(options) {
		this.setOptions(options);
	}
});
var mySlideShow = new SlideShow({
	"slides": [$("slide-1"), $("slide-2")],
	"wrap": true
});
mySlideShow.options["startSlide"]; // 0
mySlideShow.options["wrap"]; // true, também foi adicionada
</code></pre>
<h3>Definindo Eventos</h3>
<p>Não há diferença quanto a adicionar opções comuns ou eventos, os dois são adicionados da mesma maneira.</p>
<pre><code>var mySlideShow = new SlideShow({
	"slides": [$("slide-1"), $("slide-2")],
	"wrap": true,
	"onStart": function() {}
});
</code></pre>
<p>No caso de eventos, não é necessário definir uma opção padrão, já que os eventos são chamados apenas se estiverem definidos, não causando erros. Caso você considere necessário, pode-se usar <code>Class.empty</code> como padrão. <code>Class.empty</code> é apenas uma função vazia, apenas para não precisarmos nos preocupar em definir algo a ser executado.</p>
<pre><code>var SlideShow = new Class({
	"options": {
		"slides": [],
		"startSlide": 0,
		"onStart": Class.empty
	},
	"initialize": function(options) {
		this.setOptions(options);
		this.fireEvent("onStart", this.options.startSlide, 10);
	}
});
</code></pre>
<p>Assim como as outras classes, a própria biblioteca faz grande uso de <code>Options</code>. É o espírito da reutilização, tanto na própria biblioteca quanto para os desenvolvedores. Até a próxima!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/mootools-eventos/' rel='bookmark' title='Permanent Link: Mootools &#8211; Eventos'>Mootools &#8211; Eventos</a></li>
<li><a href='http://juliogreff.net/mootools-classes/' rel='bookmark' title='Permanent Link: Mootools &#8211; Classes'>Mootools &#8211; Classes</a></li>
<li><a href='http://juliogreff.net/mootools-chain/' rel='bookmark' title='Permanent Link: Mootools &#8211; Chain'>Mootools &#8211; Chain</a></li>
<li><a href='http://juliogreff.net/ajax-com-a-mootools/' rel='bookmark' title='Permanent Link: Ajax com a Mootools'>Ajax com a Mootools</a></li>
<li><a href='http://juliogreff.net/mootools-menu-sanfona/' rel='bookmark' title='Permanent Link: Mootools &#8211; Menu Sanfona'>Mootools &#8211; Menu Sanfona</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/mootools-options/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Mootools &#8211; Eventos</title>
		<link>http://juliogreff.net/mootools-eventos/</link>
		<comments>http://juliogreff.net/mootools-eventos/#comments</comments>
		<pubDate>Sat, 12 Jan 2008 16:42:55 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[bibliotecas]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[event]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://www.juliogreff.blog.br/mootools-eventos/</guid>
		<description><![CDATA[Uma função que executa quando algo começa, outra chamada quando alguma coisa termina, quando se começa o processamento ou quando&#8230; bem, você pode escolher. A Mootools permite isso, através da classe Events. Você pode implementar eventos para serem chamados quando você quiser dentro de suas funções, e é isso que mostrarei nesse post. A classe [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/mootools-options/' rel='bookmark' title='Permanent Link: Mootools &#8211; Options'>Mootools &#8211; Options</a></li>
<li><a href='http://juliogreff.net/mootools-chain/' rel='bookmark' title='Permanent Link: Mootools &#8211; Chain'>Mootools &#8211; Chain</a></li>
<li><a href='http://juliogreff.net/mootools-classes/' rel='bookmark' title='Permanent Link: Mootools &#8211; Classes'>Mootools &#8211; Classes</a></li>
<li><a href='http://juliogreff.net/ajax-com-a-mootools/' rel='bookmark' title='Permanent Link: Ajax com a Mootools'>Ajax com a Mootools</a></li>
<li><a href='http://juliogreff.net/scroller-made-in-mootools/' rel='bookmark' title='Permanent Link: Scroller Made in Mootools'>Scroller Made in Mootools</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Uma função que executa quando algo começa, outra chamada quando alguma coisa termina, quando se começa o processamento ou quando&#8230; bem, você pode escolher. A <a href="http://www.mootools.net/" rel="external" title="Mootools Library">Mootools</a> permite isso, através da classe <code>Events</code>. Você pode implementar eventos para serem chamados quando você quiser dentro de suas funções, e é isso que mostrarei nesse post.</p>
<p>A classe <code>Events</code> permite que você defina eventos para suas próprias classes. Esses eventos podem ser chamados a qualquer momento, e também podem ser criados quantos eventos forem necessários.</p>
<p>Um evento pode receber qualquer nome, mas considera-se uma boa prática criar eventos que comecem com &#8220;on&#8221;, como &#8220;onClick&#8221;, &#8220;onStart&#8221;, &#8220;onEnd&#8221;&#8230; O &#8220;on&#8221; é requerido apenas se você desejar utilizar eventos juntamente com a classe <code>Options</code> (pretendo escrever sobre ela também).</p>
<h3><a title="implementando" name="implementando"></a>Implementando</h3>
<p>Para podermos utilizar a classe <code>Events</code>, primeiro é necessário implementá-la na classe em que se deseja utilizá-la. Isso é feito através do método <code><a href="http://juliogreff.net/mootools-classes/#implementando" title="Classes Mootools - Implementando Novos Métodos">Class.implement</a></code>. Veja:</p>
<pre><code>var SlideShow = new Class({
	"initialize": function() {}
});
SlideShow.implement(new Events);
</code></pre>
<h3><a title="chamando" name="chamando"></a>Chamando Eventos</h3>
<p>Após a implementação, ainda temos que fazer as chamadas aos eventos. Para isso, utilizamos o método <code>Events.fireEvent</code>, que agora pode ser chamado do escopo da classe, ou seja, <code>this.fireEvent</code>. Esse método recebe os seguintes parâmetros:</p>
<ul>
<li><code>type</code>: O tipo do evento (&#8220;onClick&#8221;, &#8220;onDrag&#8221; ou qualquer outro)</li>
<li><code>args</code>: Argumentos a serem passados à função. Pode ser apenas um argumento ou um array contendo vários.</li>
<li><code>delay</code>: Tempo, em milissegundos, que o evento deve esperar para ser disparado.</li>
</ul>
<pre><code>var SlideShow = new Class({
	"initialize": function() {
		this.fireEvent("onStart", null, 10);
	},
	"nextSlide": function() {
		this.currentSlide += 1;
		this.fireEvent("onChangeSlide", this.currentSlide, 10);
	}
});
</code></pre>
<h3><a title="definindo" name="definindo"></a>Definindo Eventos</h3>
<p>Para definir funções a serem executadas em determinado evento, utilizamos o método <code>Events.addEvent</code>. O método recebe como parâmetros o tipo do evento e a função que deve ser executada.</p>
<pre><code>var mySlideShow = new SlideShow();
mySlideShow.addEvent("onStart", showSplashScreen);
</code></pre>
<p>Note que os eventos podem ser adicionados tanto na definição da classe quanto em uma de suas instâncias, como fizemos acima.</p>
<p>Eventos podem ter muita utilidade, e a própria biblioteca também faz bastante uso deles, como acontece nas classes <code>Ajax</code> e <code>Fx</code>. Basta ter criatividade. Até a próxima!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/mootools-options/' rel='bookmark' title='Permanent Link: Mootools &#8211; Options'>Mootools &#8211; Options</a></li>
<li><a href='http://juliogreff.net/mootools-chain/' rel='bookmark' title='Permanent Link: Mootools &#8211; Chain'>Mootools &#8211; Chain</a></li>
<li><a href='http://juliogreff.net/mootools-classes/' rel='bookmark' title='Permanent Link: Mootools &#8211; Classes'>Mootools &#8211; Classes</a></li>
<li><a href='http://juliogreff.net/ajax-com-a-mootools/' rel='bookmark' title='Permanent Link: Ajax com a Mootools'>Ajax com a Mootools</a></li>
<li><a href='http://juliogreff.net/scroller-made-in-mootools/' rel='bookmark' title='Permanent Link: Scroller Made in Mootools'>Scroller Made in Mootools</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/mootools-eventos/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Mootools &#8211; Classes</title>
		<link>http://juliogreff.net/mootools-classes/</link>
		<comments>http://juliogreff.net/mootools-classes/#comments</comments>
		<pubDate>Tue, 01 Jan 2008 16:08:40 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[bibliotecas]]></category>
		<category><![CDATA[classes]]></category>
		<category><![CDATA[mootools]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://www.juliogreff.blog.br/mootools-classes/</guid>
		<description><![CDATA[A programação orientada a objetos facilita, e muito, a vida do desenvolvedor. Podemos utilizar o mesmo código em vários lugares, para diferentes situações, modificando e estendendo apenas o que for necessário, sem precisar reescrever código. A Mootools, além de todas as outras funcionalidades, contém um sistema de criação de classes muito bem-pensado. Vamos ver como [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/mootools-eventos/' rel='bookmark' title='Permanent Link: Mootools &#8211; Eventos'>Mootools &#8211; Eventos</a></li>
<li><a href='http://juliogreff.net/mootools-chain/' rel='bookmark' title='Permanent Link: Mootools &#8211; Chain'>Mootools &#8211; Chain</a></li>
<li><a href='http://juliogreff.net/mootools-options/' rel='bookmark' title='Permanent Link: Mootools &#8211; Options'>Mootools &#8211; Options</a></li>
<li><a href='http://juliogreff.net/ajax-com-a-mootools/' rel='bookmark' title='Permanent Link: Ajax com a Mootools'>Ajax com a Mootools</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-3/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 3'>JavaScript Orientado a Objetos &#8211; Parte 3</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>A programação orientada a objetos facilita, e muito, a vida do desenvolvedor. Podemos utilizar o mesmo código em vários lugares, para diferentes situações, modificando e estendendo apenas o que for necessário, sem precisar reescrever código. A <a href="http://www.mootools.net/" rel="external" title="Mootools Library">Mootools</a>, além de todas as outras funcionalidades, contém um sistema de criação de classes muito bem-pensado. Vamos ver como escrever classes utilizando esse sistema, assim como extendê-las e herdá-las.</p>
<h3><a title="porque" name="porque"></a>Por que Classes?</h3>
<p>Classes têm algumas vantagens sobre funções independentes. Podemos modificar e reusar suas funcionalidades sem precisar modificar o código original, criar objetos que armazenam informações dentro de seu próprio escopo e também utilizar métodos relacionados ao objeto. Além disso, com classes é possível utilizar menos código em mais situações.</p>
<p>Um bom exemplo da implementação de classes é a própria Mootools. Boa parte do que há na biblioteca é baseado em classes, estendendo-as, modificando-as e herdando-as. Funções não são muito utilizadas pela Mootools, pois o poder da utilização das classes é muito maior.</p>
<h3><a title="definindo" name="definindo"></a>Definindo Classes</h3>
<p>Para definir classes com a Mootools, utilizamos o construtor <code>Class</code>. O construtor leva como parâmetros os métodos e atributos da classe, através de uma <a href="http://juliogreff.net/javascript-object-notation/" title="JavaScript Object Notation">literal de objeto</a>.</p>
<pre><code>var Vehicle = new Class({
	"initialize": function(features) {
		// Salvando as características no escopo do objeto
		this.features = features;
		this.position = 0;
	},
	"goForward": function(distance) {
		this.position += distance;
	},
	"goBackward": function(distance) {
		this.position -= distance;
	}
});
</code></pre>
<p>Na classe acima, definimos três métodos: <code>initialize</code>, <code>goForward</code> e <code>goBackward</code>. O método <code>initialize</code> deve estar presente em cada definição de classe, por ser o método que é chamado quando a classe é instanciada.</p>
<p>Após termos criado nossa classe, podemos instanciá-la sempre que necessário.</p>
<pre><code>var myVehicle = new Vehicle({"color": "red"});
// Utilizando os métodos do objeto
myVehicle.goForward(100);
// Acessando propriedades
myVehicle.position; // 100
</code></pre>
<h3><a title="estendendo" name="estendendo"></a>Estendendo Classes</h3>
<p>Como em outras linguagens orientadas a objeto, as classes podem ser estendidas para criar funcionalidades mais específicas. No caso da classe <code>Vehicle</code>, podemos estendê-la para criar tipos de veículos específicos, como carros e motos. Para isso, usamos o método <code>Class.extend</code>, levando como parâmetro os novos métodos e propriedades que a classe deve conter.</p>
<pre><code>var Car = Vehicle.extend({
	// O novo método de inicialização
	"initialize": function(features) {
		// Inicializamos a classe pai dentro da classe atual
		this.parent(features);
		this.wheels = 4;
		this.gear = 0;
	},
	"gearUp": function() {
		if(this.gear &lt; this.features.gears) this.gear++;
	},
	"gearDown": function() {
		if(this.gear &gt; -1) this.gear--;
	}
});
var Motorcycle = Vehicle.extend({
	"initialize": function(features) {
		this.parent(features);
		this.wheels = 2;
		this.gear = 0;
	},
	"gearUp": function() {
		if(this.gear &lt; this.features.gears) this.gear++;
	},
	"gearDown": function() {
		if(this.gear &gt; 0) this.gear--;
	}
});
</code></pre>
<p>Através do código acima, criamos duas novas classes baseadas em <code>Vehicle</code>, <code>Car</code> e <code>Motorcycle</code>, cada uma com suas características específicas, mas herdando os métodos da classe pai.</p>
<p>Assim como podemos criar tipos específicos de veículos, também podemos criar tipos específicos de carros e motos, bastando estender essas duas classes. Não há limite para extensões.</p>
<p>Além de estender outras classes, também é possível estender a própria classe, implementando novos métodos. Note que não é necessário recriar o método <code>Class.initialize</code>, já que não o modificamos, apesar de ser possível se necessário.</p>
<pre><code>var Car = Car.extend({
	"horn": function() {
		this.soundHorn = true;
	}
});
</code></pre>
<h3><a title="implementando" name="implementando"></a>Implementando Novos Métodos</h3>
<p>Ao estender classes, o método <code>Class.extend</code> cria uma nova cópia da classe, não alterando-a de maneira alguma. Isso é facilmente percebido, já que, em nosso exemplo, <code>myVehicle.gearUp</code> não funciona, pois a classe não foi modificada quando criamos as outras extensões.</p>
<p>Para modificar a classe sem criar uma cópia sua e sem precisar modificar código algum, a Mootools usa o método <code>Class.implement</code>, recebendo como parâmetros os métodos e propriedades a serem implementados.</p>
<p>Modificando o último exemplo, poderíamos trocar <code>Car.extend</code> para <code>Car.implement</code>, eliminando a cópia desnecessária que criamos.</p>
<pre><code>Car.implement({
	"horn": function() {
		this.soundHorn = true;
	}
});
</code></pre>
<p>Vale lembrar que utilizando <code>Class.implement</code> não temos acesso ao método <code>this.parent</code>, já que não estamos criando uma outra classe, somente implementando propriedades. Nesse caso, não há classe pai.</p>
<p>O uso de classes permite muito mais do que reutilização de código. Poupa-se tempo tanto no desenvolvimento quanto no uso do código e esse uso torna-se muito mais intuitivo, já que aproxima a programação de objetos reais. Por essas e outras que sou adepto dessa maravilhosa biblioteca. Até a próxima!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/mootools-eventos/' rel='bookmark' title='Permanent Link: Mootools &#8211; Eventos'>Mootools &#8211; Eventos</a></li>
<li><a href='http://juliogreff.net/mootools-chain/' rel='bookmark' title='Permanent Link: Mootools &#8211; Chain'>Mootools &#8211; Chain</a></li>
<li><a href='http://juliogreff.net/mootools-options/' rel='bookmark' title='Permanent Link: Mootools &#8211; Options'>Mootools &#8211; Options</a></li>
<li><a href='http://juliogreff.net/ajax-com-a-mootools/' rel='bookmark' title='Permanent Link: Ajax com a Mootools'>Ajax com a Mootools</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-3/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 3'>JavaScript Orientado a Objetos &#8211; Parte 3</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/mootools-classes/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Funções em Diferentes Escopos</title>
		<link>http://juliogreff.net/funcoes-em-diferentes-escopos/</link>
		<comments>http://juliogreff.net/funcoes-em-diferentes-escopos/#comments</comments>
		<pubDate>Wed, 19 Dec 2007 23:13:56 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[escopo]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://www.juliogreff.blog.br/funcoes-em-diferentes-escopos/</guid>
		<description><![CDATA[Se você programa em JavaScript orientado a objeto (1, 2, 3), provavelmente já teve alguns problemas com funções que deveriam ser executadas em um determinado escopo. Nesse post vou explicar como executar e vincular funções ao escopo de algum objeto. Executando Para chamar um método no escopo de outro objeto, utilizamos o método Function.apply. O [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/criando-funcoes-dinamicamente/' rel='bookmark' title='Permanent Link: Criando Funções Dinamicamente'>Criando Funções Dinamicamente</a></li>
<li><a href='http://juliogreff.net/escopo-de-variaveis/' rel='bookmark' title='Permanent Link: Escopo de Variáveis'>Escopo de Variáveis</a></li>
<li><a href='http://juliogreff.net/mootools-eventos/' rel='bookmark' title='Permanent Link: Mootools &#8211; Eventos'>Mootools &#8211; Eventos</a></li>
<li><a href='http://juliogreff.net/usando-with/' rel='bookmark' title='Permanent Link: Usando &#8220;With&#8221;'>Usando &#8220;With&#8221;</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-2/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 2'>JavaScript Orientado a Objetos &#8211; Parte 2</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Se você programa em JavaScript orientado a objeto (<a href="http://juliogreff.net/javascript-orientado-a-objeto-parte-1/" title="JavaScript Orientado a Objeto - Parte 1">1</a>, <a href="http://juliogreff.net/javascript-orientado-a-objetos-parte-2/" title="JavaScript Orientado a Objeto - Parte 2">2</a>, <a href="http://juliogreff.net/javascript-orientado-a-objetos-parte-3/" title="JavaScript Orientado a Objeto - Parte 3">3</a>), provavelmente já teve alguns problemas com funções que deveriam ser executadas em um determinado escopo. Nesse post vou explicar como executar e vincular funções ao escopo de algum objeto.</p>
<h3>Executando</h3>
<p>Para chamar um método no escopo de outro objeto, utilizamos o método <code>Function.apply</code>. O objeto <code>Function</code> pode ser qualquer função que será chamada no escopo que deve ser passado como primeiro parâmetro. Vamos a um exemplo:</p>
<pre><code>var Class = function() {

 this.text = "Escopo da Classe";

}

Class = new Class();

var showText = function() {

 alert(this.text);

}

// Escopo Global

showText(); // undefined

// Escopo de Class

showText.apply(Class); // "Escopo da Classe"

</code></pre>
<p>O resultado da primeira chamada a função é obvio: não há <code>this.text</code> definido. Quando aplicamos a mesma função no escopo de <code>Class</code>, o retorno sai como esperado.</p>
<p>O método <code>Function.apply</code> também pode receber um segundo parâmetro, contendo os parãmetros que devem ser passados à função. Esse parâmetro deve ser obrigatoriamente um array, e deve ser definido na ordem em que os parâmetros precisam ser recebidos.</p>
<pre><code>var Class = function() {

 this.text = "Também podemos passar parâmetros:";

}

var Class = new Class();

var showText = function(text) {

 alert(this.text + " " + text);

}

showText(); // undefined undefined

showText.apply(Class, ["Viva!"]); // "Também podemos passar parâmetros: Viva!"

</code></pre>
<p>Também há o método <code>Function.call</code>, que tem a mesma função de <code>Function.aplly</code>. A diferença está em como os parâmetros para a função são definidos. Em <code>Function.apply</code>, eles são passados como um array, e em <code>Function.call</code> são passados como vários argumentos, sem a necessidade de estarem dentro de algum array.</p>
<pre><code>var Class = function() {

 this.text = "Também podemos passar parâmetros:";

}

var Class = new Class();

var showText = function(text) {

 alert(this.text + " " + text);

}

showText(); // undefined undefined

showText.call(Class, "Eba!"); // "Também podemos passar parâmetros: Eba!"

</code></pre>
<h3>Vinculando</h3>
<p>O <code>Function.apply</code> resolve os problemas de muita gente, mas não todos os problemas. Imagine a seguinte situação (pela qual eu também já passei), onde precisamos recuperar uma variável da classe de dentro do objeto <code>XMLHttpRequest</code>:</p>
<pre><code>function() {

 this.msgToShow = "Completo!";

 XMLHttpRequest.onreadystatechange = show;

}

var show = function() {

 alert(this.msgToShow);

}

</code></pre>
<p>E agora? Precisamos executar a função <code>show</code> no escopo da classe, e não no escopo do <code>XMLHttpRequest</code>. Poderíamos usar o <code>Function.apply</code>, mas ele executaria a função assim que fosse chamado. A solução é <em>vincular</em> a função ao escopo do objeto <code>XMLHttpRequest</code>. A solução mais comum é o uso de <em>closures</em>:</p>
<pre><code>function() {

 var self = this;

 this.msgToShow = "Completo!";

 XMLHttpRequest.onreadystatechange = function() {

 	show.apply(self);

 }

}

var show = function() {

 alert(this.msgToShow);

}

</code></pre>
<p>Nos aproveitamos da capacidade do JavaScript de compartilhar variáveis entre funções, e armazenamos o escopo correto na variável <code>self</code>, que utilizamos para aplicar a função.</p>
<h3>Reutilização</h3>
<p>Tudo funcionando dentro do esperado, mas não estamos pensando na parte mais bela da programação orientada a objetos: a reutilização. Teríamos que criar closures toda vez em que uma execução em outro escopo fosse necessária. Pra isso existe o método <code>Function.bind</code>, criado para vincular a função a qualquer escopo. A função é a seguinte:</p>
<pre><code>Function.prototype.bind = function() {

 var self = this, args = $A(arguments), scope = args.shift();

 return function() {

 	return self.apply(scope, args.concat($A(arguments)));

 }

}

var $A = function(object) {

 var array = [];

 for(var i = 0; i &lt; object.length; i++)

 	array[i] = object[i];

 return array;

}</code></pre>
<p>Esse método cria o closure e retorna uma função que executa o que for necessário. A função <code>$A</code> só serve para transformar os argumentos em um array. Modificando nosso script anterior:</p>
<pre><code>function() {

 this.msgToShow = "Completo!";

 XMLHttpRequest.onreadystatechange = show.bind(this);

}

var show = function() {

 alert(this.msgToShow);

}

</code></pre>
<p>Quem não trabalha com POO, eventos ou timeouts talvez não tenha se deparado com nenhum problema deste tipo, mas duvido que alguém desse ramo nunca tenha recebido um &#8220;undefined&#8221; sem querer&#8230;</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/criando-funcoes-dinamicamente/' rel='bookmark' title='Permanent Link: Criando Funções Dinamicamente'>Criando Funções Dinamicamente</a></li>
<li><a href='http://juliogreff.net/escopo-de-variaveis/' rel='bookmark' title='Permanent Link: Escopo de Variáveis'>Escopo de Variáveis</a></li>
<li><a href='http://juliogreff.net/mootools-eventos/' rel='bookmark' title='Permanent Link: Mootools &#8211; Eventos'>Mootools &#8211; Eventos</a></li>
<li><a href='http://juliogreff.net/usando-with/' rel='bookmark' title='Permanent Link: Usando &#8220;With&#8221;'>Usando &#8220;With&#8221;</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-2/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 2'>JavaScript Orientado a Objetos &#8211; Parte 2</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/funcoes-em-diferentes-escopos/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>POO na Vida Real</title>
		<link>http://juliogreff.net/poo-na-vida-real/</link>
		<comments>http://juliogreff.net/poo-na-vida-real/#comments</comments>
		<pubDate>Wed, 23 May 2007 22:10:15 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[filosofia]]></category>
		<category><![CDATA[poo]]></category>

		<guid isPermaLink="false">http://www.juliogreff.blog.br/poo-na-vida-real/</guid>
		<description><![CDATA[A Orientação a Objetos na programação client-side é um poderoso recurso, tornando tudo mais fácil, rápido e compacto, economizando preciosos bytes. A programação orientada a objetos é uma arte, e saber quando e como usar tornam você um artista. Aceita o desafio de aprender uma nova técnica? Então vamos lá. Vou falar do pouco que [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/controle-de-erros-em-js/' rel='bookmark' title='Permanent Link: Controle de Erros em JS'>Controle de Erros em JS</a></li>
<li><a href='http://juliogreff.net/caindo-na-real/' rel='bookmark' title='Permanent Link: Caindo na Real'>Caindo na Real</a></li>
<li><a href='http://juliogreff.net/estendendo-objetos-dom/' rel='bookmark' title='Permanent Link: Estendendo Objetos DOM'>Estendendo Objetos DOM</a></li>
<li><a href='http://juliogreff.net/lancada-a-mootools-12/' rel='bookmark' title='Permanent Link: Lançada a Mootools 1.2'>Lançada a Mootools 1.2</a></li>
<li><a href='http://juliogreff.net/fila-de-requisicoes-em-ajax/' rel='bookmark' title='Permanent Link: Fila de Requisições em Ajax'>Fila de Requisições em Ajax</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>A <a href="http://juliogreff.net/javascript-orientado-a-objetos-parte-1/" title="JavaScript Orientado a Objetos - Parte 1">Orientação a Objetos na programação client-side</a> é um poderoso recurso, tornando tudo mais fácil, rápido e compacto, economizando preciosos bytes. A programação orientada a objetos é uma arte, e saber quando e como usar tornam você um artista. Aceita o desafio de aprender uma nova técnica? Então vamos lá.</p>
<p>Vou falar do pouco que sei sobre a aplicação real da<br />
<abbr title="Programação Orientada a Objeto">POO</abbr>. O melhor lugar pra se implementar a <abbr title="Programação Orientada a Objeto">POO</abbr> são os objetos DOM, pois eles já tem uma classe criada, e o <a href="http://juliogreff.net/estendendo-objetos-dom/" title="Estendendo Objetos DOM">JavaScript nos permite extendê-la</a>.<br />
Vamos ao primeiro exemplo: um menu expansível. Normalmente, usamos algo próximo disso:</p>
<pre><code>menu.onclick = function() { toggle($("menu"); }</code></pre>
<p>Descontando a parte obstrusiva, nada parece errado, e na verdade não está. Toda vez que clicamos no menu, ele executa a função <code>toggle</code>, que executaria outra função para saber se o menu estava expandido ou não (geralmente uma verificação na classe CSS). Mas podemos melhorar.</p>
<p>Consideremos tudo como um objeto. Nesse caso, o menu seria um objeto. Portanto, ele precisa de uma função construtora para podermos cria-lo. Precisaremos dos seguintes atributos e métodos:</p>
<ul>
<li><code>element</code>: o elemento DOM que representa o menu.</li>
<li><code>contracted</code>: atributo booleano, indica se o menu está contraído ou não.</li>
<li><code>toggle()</code>: nossa querida função que irá contrair e expandir o menu.</li>
</ul>
<p>Poderíamos adicionar <code>expand()</code> e <code>contract()</code>, mas vamos resumir. Vejamos a função construtora:</p>
<pre><code>function Menu(element) {
  this.element = element;
  this.element.onclick = function() { this.toggle(); }; // obstrusivo, dá um desconto né?
  this.element.className = "contract-menu"; // já escondemos o menu
  this.contracted = true; // e indicamos que ele está escondido
  this.toggle = function() {
    if(this.contracted === true) {
	  this.element.className = "expand-menu";
	  this.contracted = false;
	}
    else {
	  this.element.className = "contract-menu";
	  this.contracted = true;
	}
  }
}
</code></pre>
<p>Peraí, não aumentamos o tamanho de código? Sim, mas a maravilha é exatamente essa. Você precisará desse código apenas uma vez, e alguns caracteres criam vários e vários menus com as mesmas propriedades. Um <code>var menu = new Menu($("elemento"))</code> resolve tudo. E também poderíamos reutilizar o código fazendo sub-menus, ou adicionando novos métodos em tempo de execução, caso sejam necessários. Interessante, não?</p>
<p>A implementação em objetos DOM é extremamente simples. Tudo que utilizar um estado (variáveis de instância) pode partir pra orientação a objeto. Agora vamos para algo menos visível.</p>
<p>Uma requisição em Ajax tem variáveis de instância. Também muito simples depois que se pega a essência da coisa. Vejamos a função construtora:</p>
<pre><code>function Ajax(url /*, options*/) { // simples, sem opções por agora
  this.url = url;
  var requestResponses = reqAjax(this.url); // variável privada
  // a função acima já usa POO, não vamos nos preocupar com ela dessa vez
  // ela retorna { responseText, responseXML, errors }
  this.getResponseText = function() {
    if(typeof requestResponses.errors != "undefined") this.throw(requestResponses.errors);
    else return requestResponses.responseText;
  }
  this.getResponseXML = function() {
    if(typeof requestResponses.errors != "undefined") this.throw(requestResponses.errors);
    else return requestResponses.responseXML;
  }
  this.throw = function(errors) {
    if(typeof errors == "undefined") return requestResponses.errors;
	else throw("Requisição retornou erros: " + errors);
  }
}
</code></pre>
<p>Só uma função extremamente simplória e não muito útil. Só pra fazer uma demonstração (estava tentando pensar em algo mais elaborado, mas fugiu da mente). Realmente deseja um desafio? Tente <strong>criar</strong> a função <code>reqAjax</code> com tudo que ela tem direito. Um quebra-cabeça, literalmente.</p>
<p>Quer mais? Bom, então recomendo ler um pouco sobre Ruby. Sim, é server-side, não tem nada a ver, mas a orientação a objeto é realmente interessante. Extremamente recomendado.</p>
<p>Eu até queria postar mais alguns exemplos, mas só vieram a mente coisas muito grandes, e não ando com tempo pra isso. Podem deixar sugestões nos comentários, aí eu volto e edito o post. Fui!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/controle-de-erros-em-js/' rel='bookmark' title='Permanent Link: Controle de Erros em JS'>Controle de Erros em JS</a></li>
<li><a href='http://juliogreff.net/caindo-na-real/' rel='bookmark' title='Permanent Link: Caindo na Real'>Caindo na Real</a></li>
<li><a href='http://juliogreff.net/estendendo-objetos-dom/' rel='bookmark' title='Permanent Link: Estendendo Objetos DOM'>Estendendo Objetos DOM</a></li>
<li><a href='http://juliogreff.net/lancada-a-mootools-12/' rel='bookmark' title='Permanent Link: Lançada a Mootools 1.2'>Lançada a Mootools 1.2</a></li>
<li><a href='http://juliogreff.net/fila-de-requisicoes-em-ajax/' rel='bookmark' title='Permanent Link: Fila de Requisições em Ajax'>Fila de Requisições em Ajax</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/poo-na-vida-real/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>As Vantagens de Prototype</title>
		<link>http://juliogreff.net/as-vantagens-de-prototype/</link>
		<comments>http://juliogreff.net/as-vantagens-de-prototype/#comments</comments>
		<pubDate>Sat, 09 Dec 2006 13:26:08 +0000</pubDate>
		<dc:creator>Julio Greff</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://www.juliogreff.blog.br/?p=44</guid>
		<description><![CDATA[Alguns não gostam, alguns adoram, outros usam de vez em quando. O prototype (não o framework), apesar de aumentar um pouco a quantidade de código, pode ser muito útil em certas aplicações. Em outras, nem tanto. Como já expliquei, o prototype não sobrescreve nada que já esteja definido, portanto, é necessário prestar atenção em um [...]

<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/funcoes-em-diferentes-escopos/' rel='bookmark' title='Permanent Link: Funções em Diferentes Escopos'>Funções em Diferentes Escopos</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-2/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 2'>JavaScript Orientado a Objetos &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/escopo-de-variaveis/' rel='bookmark' title='Permanent Link: Escopo de Variáveis'>Escopo de Variáveis</a></li>
<li><a href='http://juliogreff.net/mootools-chain/' rel='bookmark' title='Permanent Link: Mootools &#8211; Chain'>Mootools &#8211; Chain</a></li>
<li><a href='http://juliogreff.net/estendendo-o-javascript/' rel='bookmark' title='Permanent Link: Estendendo o JavaScript'>Estendendo o JavaScript</a></li>
</ul>]]></description>
			<content:encoded><![CDATA[<p>Alguns não gostam, alguns adoram, outros usam de vez em quando. O prototype (não o framework), apesar de aumentar um pouco a quantidade de código, pode ser muito útil em certas aplicações. Em outras, nem tanto.</p>
<p>Como <a href="http://juliogreff.net/javascript-orientado-a-objetos-parte-2" title="JavaScript Orientado a Objetos - Parte 2">já expliquei</a>, o prototype não sobrescreve nada que já esteja definido, portanto, é necessário prestar atenção em um pequenino detalhe.</p>
<p>Há uns tempos atrás, tive um certo problema com a construção do FrameWorX. Não conseguia acessar uma variável que estava fora de uma função que estava usando, mas ainda dentro da classe. Na tentativa-e-erro (leia-se <acronym title="Programação Orientada a Gambiarra">POG</acronym>), descobri como acessa-la: o prototype. O problema foi que ele não sobrescrevia o valor <code>false</code>. Portanto, nada podia ser definido.</p>
<h3>O Princípio</h3>
<p>O princípio para o prototype sobrescrever algo é o seguinte: criar esse &#8220;algo&#8221; com ele mesmo.</p>
<pre><code>function errado() {

  this.variavel = "";

}

errado.prototype.variavel = "Outra coisa"; // Assim não dá certo!

function certo() {

  // Não tem nada definido aqui dentro!

}

certo.prototype.variavel = "Outra coisa"; // Assim funciona!</code></pre>
<p>Esse método pode ser usado dentro de métodos privados para acessar variáveis públicas (meu eterno problema foi resolvido!), funções autônomas (aquelas que não tem nome, tipo window.onload = function() {&#8230;}) ou para criar toda a classe.</p>
<h3>Criando a Classe</h3>
<p>Podemos criar a classe inteira com o prototype. Os métodos e propriedades podem ser adicionados através dele, e inclusive o corpo do construtor, e nada ficaria dentro da definição da função.</p>
<p>Nesse caso, nem sempre é uma boa. Não sei quanto à questão do desempenho, mas o código fica sensivelmente maior, às vezes desnecessariamente.</p>
<p>Espero que não tenham ficado dúvidas. Qualquer coisa, comente!</p>


<h3>Posts Relacionados</h3><ul><li><a href='http://juliogreff.net/funcoes-em-diferentes-escopos/' rel='bookmark' title='Permanent Link: Funções em Diferentes Escopos'>Funções em Diferentes Escopos</a></li>
<li><a href='http://juliogreff.net/javascript-orientado-a-objetos-parte-2/' rel='bookmark' title='Permanent Link: JavaScript Orientado a Objetos &#8211; Parte 2'>JavaScript Orientado a Objetos &#8211; Parte 2</a></li>
<li><a href='http://juliogreff.net/escopo-de-variaveis/' rel='bookmark' title='Permanent Link: Escopo de Variáveis'>Escopo de Variáveis</a></li>
<li><a href='http://juliogreff.net/mootools-chain/' rel='bookmark' title='Permanent Link: Mootools &#8211; Chain'>Mootools &#8211; Chain</a></li>
<li><a href='http://juliogreff.net/estendendo-o-javascript/' rel='bookmark' title='Permanent Link: Estendendo o JavaScript'>Estendendo o JavaScript</a></li>
</ul>]]></content:encoded>
			<wfw:commentRss>http://juliogreff.net/as-vantagens-de-prototype/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
	</channel>
</rss>

