Escolar Documentos
Profissional Documentos
Cultura Documentos
Stoyan Stefanov
Novatec
Authorized Portuguese translation of the English edition of titled JavaScript Patterns, First Edition, ISBN: 978-0596-80675-0 2010, Stoyan Stefanov. This translation is published and sold by permission of O'Reilly Media, Inc.,
the owner of all rights to publish and sell the same.
Traduo em portugus autorizada da edio em ingls do ttulo JavaScript Patterns, First Edition, ISBN: 978-0596-80675-0 2010, Stoyan Stefanov. Esta traduo publicada e vendida com a permisso da O'Reilly Media,
Inc., detentora de todos os direitos para publicao e venda desta obra.
Novatec Editora Ltda. 2011.
Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. proibida a reproduo desta obra, mesmo
parcial, por qualquer processo, sem prvia autorizao, por escrito, do autor e da Editora.
Editor: Rubens Prates
Traduo: Edgard Damiani
Reviso gramatical: Carla Mello Moreira
Editorao eletrnica: Camila Kuwabata e Carolina Kuwabata
ISBN: 978-85-7522-266-9
Histrico de impresses:
Janeiro/2011
Primeira edio
Dados
10-13324
CDD-005.133
ndices para catlogo sistemtico:
1. JavaScript : Linguagem de programao :
Computadores : Processamento de dados
005.133
OGF_20101207
(CIP)
captulo 1
Introduo
JavaScript a linguagem da web. Ela comeou como uma forma de manipular alguns
tipos de elementos selecionados em uma pgina web (como imagens ou campos de
formulrios), mas acabou crescendo enormemente. Alm de servir como script de
navegador no lado do cliente, atualmente voc pode usar o JavaScript para programar em uma variedade cada vez maior de plataformas. Voc pode escrever cdigo
no lado do servidor (usando .NET ou Node.js), aplicaes desktop (que funcionam
em todos os sistemas operacionais) e extenses de aplicao (por exemplo, Firefox
ou Photoshop), aplicaes para dispositivos mveis e scripts de linha de comando.
O JavaScript tambm uma linguagem incomum. Ela no possui classes, e funes
so usadas como objetos de primeira classe em vrias tarefas. Inicialmente, a linguagem foi considerada deficiente por vrios desenvolvedores, mas nos ltimos anos esse
sentimento tem mudado. Curiosamente, linguagens como Java e PHP comearam a
adicionar funcionalidades como closures e funes annimas, que os desenvolvedores
JavaScript vm utilizando corriqueiramente h algum tempo.
O JavaScript suficientemente dinmico a ponto de ser possvel faz-lo parecer com
qualquer outra linguagem com a qual voc se sinta confortvel. Mas a melhor abordagem abraar suas diferenas e estudar seus padres especficos.
Padres
Um padro (pattern), no sentido mais amplo da palavra, um tema de eventos ou
objetos recorrentes [...] ele pode ser um template ou modelo utilizado para gerar
coisas (http://en.wikipedia.org/wiki/Pattern).
Em desenvolvimento de software, um padro uma soluo para um problema
comum. Um padro no necessariamente uma soluo de cdigo pronta para ser
copiada e colada, e sim mais uma prtica melhor, uma abstrao til e um modelo
de resoluo de categorias de problemas.
importante identificar padres porque:
Eles nos ajudam a escrever melhores cdigos, utilizando prticas comprovadas
e no reinventando a roda.
17
18
Padres JavaScript
Captulo 1 Introduo
19
JavaScript: conceitos
Vamos revisar rapidamente alguns conceitos importantes que fornecem o contexto
para os prximos captulos.
Orientado a objeto
JavaScript uma linguagem orientada a objetos, o que costuma surpreender desenvolvedores que previamente observaram a linguagem e dispensaram-na. Tudo o que
voc v em um trecho de cdigo JavaScript tem boa chance de ser um objeto. Apenas
cinco tipos primitivos no so objetos: numrico, string, booleano, null e undefined, e
os primeiros trs tm representaes correspondentes de objetos na forma de encapsuladores primitivos (discutidos no prximo captulo). Valores primitivos numricos,
booleanos e de string so facilmente convertidos em objetos, seja pelo prprio programador ou, s vezes, nos bastidores pelo interpretador JavaScript.
Funes tambm so objetos. Elas podem ter propriedades e mtodos.
A coisa mais simples que voc pode fazer em uma linguagem definir uma varivel.
Bem, no JavaScript, ao definir uma varivel, voc j est lidando com objetos. Primeiro,
a varivel automaticamente torna-se uma propriedade de um objeto interno conhecido
como um Objeto de Ativao (ou uma propriedade do objeto global, caso seja uma
varivel global). Segundo, essa varivel tambm , na verdade, algo como um objeto,
porque ela tem suas propriedades particulares (chamadas atributos) que determinam
se a varivel pode ser modificada, apagada ou enumerada em um loop for-in. Esses
atributos no so expostos explicitamente na ECMAScript 3, mas a edio 5 oferece
mtodos descritores especiais para manipul-los.
Afinal, o que so esses objetos? Eles devem ser um tanto especiais, j que podem fazer
tantas coisas. Na verdade eles so extremamente simples. Um objeto apenas uma
coleo de propriedades nomeadas, uma lista de pares nome-valor (quase idntico a
um array associativo em outras linguagens). Algumas das propriedades podem ser
funes (objetos-funo), que, no caso, chamamos de mtodos.
Outra coisa sobre os objetos que voc cria que voc pode modific-los a qualquer
momento (apesar de a ECMAScript 5 introduzir APIs que previnem mutaes). Voc
pode pegar um objeto e adicionar, remover e atualizar seus membros. Se estiver preocupado sobre privacidade e acesso, tambm veremos padres para isso.
E uma ltima coisa para se ter em mente que existem dois tipos principais de objetos:
Nativo
Descrito pela norma ECMAScript.
20
Padres JavaScript
De hospedeiro (host)
Definido pelo ambiente hospedeiro (por exemplo, o ambiente do navegador web).
Os objetos nativos tambm podem ser categorizados como embutidos (por exemplo,
Array, Date) ou definidos pelo usurio (var o = {};).
Objetos de hospedeiro so, por exemplo, o objeto window e todos os objetos DOM. Se
quiser saber se voc est utilizando objetos de hospedeiro, tente executar seu cdigo
em um ambiente diferente do ambiente de navegador. Se funcionar corretamente,
provavelmente voc est usando apenas objetos nativos.
Sem classes
Voc ver esta afirmao repetida em vrias ocasies ao longo do livro: no h classes
no JavaScript. Isso um conceito novo para os programadores experientes de outras
linguagens e leva mais do que algumas repeties, e mais do que um pouco de esforo, para desaprender classes e aceitar que o JavaScript lida apenas com objetos.
No ter classes torna os seus programas mais curtos voc no precisa ter uma classe
para criar um objeto. Considere essa criao de objeto no estilo Java:
// criao de objeto no estilo Java
HelloOO hello_oo = new HelloOO();
Repetir trs vezes a mesma coisa parece um exagero quando se quer criar objetos
simples. E normalmente desejamos manter nossos objetos simples.
No JavaScript, voc cria um objeto em branco quando precisa de um e, ento, comea a adicionar membros interessantes a ele. Voc compe objetos adicionando
tipos primitivos, funes e outros objetos a eles como sendo suas propriedades. Um
objeto em branco no totalmente vazio; ele j vem com algumas propriedades
embutidas, mas no possui propriedades particulares. Falaremos mais sobre isso no
prximo captulo.
Uma das regras gerais do livro Gang of Four diz assim: Prefira composio de objetos a herana de classes. Isso significa que, se voc puder criar objetos a partir de
elementos disponveis que esto dando sopa, isso uma abordagem muito melhor
do que criar longas cadeias de herana e classificaes pai-filho. No JavaScript, fcil
seguir esse conselho simplesmente porque no h classes, e composio de objetos
o que voc vai acabar fazendo de qualquer maneira.
Prottipos
O JavaScript possui herana, apesar de isso ser apenas uma das formas de reutilizar
cdigo (e teremos um captulo inteiro sobre reutilizao de cdigo). Herana pode
Captulo 1 Introduo
21
Ambiente
Programas JavaScript precisam de um ambiente para serem executados. O habitat
natural de um programa JavaScript o navegador web, mas esse no o nico ambiente disponvel. Os padres mostrados neste livro so na sua maioria relacionados
ao ncleo (core) do JavaScript (ECMAScript), ento eles so independentes do ambiente. As excees so:
o captulo 8, que lida especificamente com padres de navegador;
alguns outros exemplos que ilustram aplicaes prticas de um padro.
Os ambientes podem fornecer objetos de hospedeiro prprios, que no so definidos na
norma ECMAScript e que podem ter comportamento no especificado ou indefinido.
ECMAScript 5
O ncleo (core) da linguagem de programao JavaScript (que exclui o DOM, o
BOM e objetos de hospedeiro extras) baseado na norma ECMAScript, ou ES para
abreviar. A verso 3 da norma foi aceita oficialmente em 1999 e a verso atualmente
implementada nos navegadores. A verso 4 foi abandonada e a verso 5 foi aprovada
em dezembro de 2009, 10 anos aps a verso prvia.
A verso 5 inclui na linguagem alguns objetos embutidos, propriedades e mtodos
novos, mas sua incluso mais importante foi o chamado modo estrito, que, na verdade, remove algumas funcionalidades da linguagem, tornando os programas mais
simples e menos propensos a erros. Por exemplo, o uso da instruo with tem sido
questionado ao longo dos anos. Agora, no modo estrito do ES5 ela gera um erro,
apesar de no haver problemas em utiliz-la no modo no estrito. O modo estrito
ativado por uma string comum, que as implementaes mais antigas da linguagem
simplesmente ignoram. Isso significa que o uso do modo estrito compatvel com
22
Padres JavaScript
as verses anteriores, j que ele no gera erros em navegadores mais antigos que no
o reconheam.
Uma vez por escopo (seja escopo de funo, escopo global ou no incio de uma string
passada com eval()), voc pode usar a seguinte string:
function my() {
"use strict";
// o resto da funo...
}
JSLint
JavaScript uma linguagem interpretada sem verificaes estticas em tempo de
compilao. Assim, possvel gerar um programa defeituoso com apenas um erro de
digitao sem se aperceber do fato. aqui que o JSLint ajuda.
O JSLint (http://jslint.com) uma ferramenta de qualidade de cdigo JavaScript,
criada por Douglas Crockford, que inspeciona seu cdigo e avisa sobre problemas
em potencial. altamente recomendvel que voc execute seu cdigo por meio do
JSLint. A ferramenta vai ferir seus sentimentos, como o prprio criador alerta, mas
apenas no incio. Voc pode aprender rapidamente com seus erros e adotar hbitos
essenciais de um programador JavaScript profissional. No ter erros JSLint em seu
cdigo tambm ajuda a ter mais confiana no cdigo, sabendo que, na pressa, voc
no cometeu uma simples omisso ou erro de sintaxe.
23
Captulo 1 Introduo
No prximo captulo, voc ver que o JSLint bastante mencionado. Todo o cdigo
no livro passa com sucesso na verificao do JSLint (usando as configuraes padro
correntes no momento em que escrevemos o cdigo), exceto por algumas poucas
ocasies claramente demarcadas como antipadres.
Em suas configuraes padro, o JSLint espera que seu cdigo seja compatvel com
o modo estrito.
Objeto console
O objeto console utilizado ao longo do livro. Esse objeto no faz parte da linguagem,
e sim do ambiente, e est presente na maioria dos navegadores atuais. No Firefox,
por exemplo, ele vem com a extenso Firebug. O console do Firebug possui uma
interface de usurio que lhe permite digitar e testar rapidamente trechos de cdigo
JavaScript, alm de brincar com a pgina carregada atualmente (Figura 1.1). Ele
tambm altamente recomendado como ferramenta de aprendizado e explorao.
Funcionalidades semelhantes esto disponveis nos navegadores WebKit (Safari e
Chrome) como parte do Web Inspector, e no IE a partir da verso 8 como parte das
Developer Tools (Ferramentas do Desenvolvedor).
A maioria dos exemplos de cdigo no livro usa o objeto console, em vez de usar alert()
ou ter de atualizar a pgina atual, porque isso uma maneira simples e no intrusiva
de imprimir sadas.
24
Padres JavaScript