Prototype: ampliando os superpoderes de classes Javascript
Javascript possui um recurso chamado prototype, que permite modificar uma classe depois que ela foi criada. Permite inclusive alterar classes internas da linguagem. Neste exemplo, vamos dar à classe Date um método strftime.
Protoquem?
Primeiro, é importante desfazer uma confusão comum. Existe uma biblioteca javascript, muito boa por sinal, chamada prototype.js. Não é dela que vamos falar neste artigo, mas de um recurso da linguagem chamado prototype. Com ele, você pode alterar classes depois que elas foram criadas. Por exemplo, veja esta classe:
1 2 3 4 5 6 | // Classe Pessoa, tem nome, email e idade function Pessoa(nome,email,idade){ this.nome=nome this.email=email this.idade=idade } |
Posso escrever, fora dela, o seguinte código:
8 9 10 11 | // Criando um método novo na classe Pessoa, de fora dela. Pessoa.prototype.digaOi=function(){ alert("Oi, eu sou "+this.nome+"!") } |
E a partir desse ponto, todas pessoas pessoas que eu criar com a classe Pessoa vão ter um método digaOi:
13 14 15 | // Testando a classe Pessoa joaquim=Pessoa("Joaquim","jalmeida@cia.gov",33) joaquim.digaOi() |
Para que serve?
Você pode estar se perguntando porque não incluir o método diretamente na classe. Há algumas situações em que trabalhar com o prototype pode ser bastante útil.
Uma delas é quando você tem uma biblioteca que é usada em várias páginas, e você quer que uma das classes dessa biblioteca tenha um comportamento diferente em apenas uma de suas páginas. Se você copiar a biblioteca inteira e modificar, vai ter que se lembrar de manter as duas e cada correção feita precisará ser reproduzida em ambos os arquivos. Você pode então escrever um aruqivo javascript que altera, via prototype, o comportamento da classe desejada, e incluir esse arquivo apenas na página em que ela tem que se comportar de maneira diferente.
Um outro uso muito útil é alterar o comportamento de classes do próprio Javascript. Por exemplo, se você fizer:
1 2 3 4 5 | // Vamos ensinar um truque novo para // nossas velhas strings? String.prototype.trim=function(){ return this.replace(/^ +| +$/g,"") } |
Suas strings vão ganhar um método trim:
6 7 8 9 | // Criamos uma string x=" teste " // Retorna "teste" alert(x.trim()) |
strftime
Para demonstrar o poder desse recurso, criamos um pequeno script que, se incluído em suas páginas, vai dar aos seus objetos de data javascript um método strftime. Ele funciona exatamente como o strftime em PHP, exceto:
- Não implementamos os curingas: %j, %U, %V, %W e %Z
- Os curingas %g e %G foram implementados com defeito
A biblioteca pode ser obtida aqui: strftime.js (2.6KB). Você pode ver os pequenos testes unitários que eu escrevi para me auxiliar na escrita desse código no diretório da biblioteca.
Para usá-la inclua o script em sua página. Depois, em seus scripts, vai poder fazer coisas como:
1 2 | d=new Date() alert(d.strftime("Hoje é %x e agora são %X")) |
Se você desenvolver mais coisas uteis com prototype, por favor, deixe um comentário abaixo ou, se preferir, escreva um artigo aqui no ClientSide, para que todos possamos apreciar.
Entry Details
Publicado em 04/12/2007 às 10:12 em Básico, Javascript

Excelente dica, eu já havia consultado sobre como funciona o prototype, mas era difícil de compreender o porque da utilização.
O texto mostrou bem isso, e está bem fácil de entender.
Parabéns pelo blog!
O prototype é um grande recurso mesmo, assim como este site vem sendo. Parabéns pela iniciativa.
Por falar em data, talvez seja interessante indicar este recurso: http://www.datejs.com/
Abraços.
[…] Segue um link (espetacular) sobre prototype no javascript (eu não saberia explicar dessa maneira :p) : LINK […]
Super!
Sou admiradora da arte e tenho uma sugestão para o strftime.js:
o que seria algo como:
reduz um pouco o script, Mas foi só uma observação mesmo!
Parabéns pelo site.
Elcio, existe algo parecido com esse recurso em outras linguagens? Não vejo isso em lugar outro, uma vez que o adequado seria extender a classe e sobreescrever métodos, não?
*sabendo, lógico, de todas as limitações de OO que o javascript tem
Chris,
Isso não é uma limitação, é uma vantagem. Em Javascript você pode estender normalmente as suas próprias classes. Mas em Java, C, Python ou PHP, não pode modificar os tipos primitivos.
Mas com prototype você pode. Nenhuma das linguagens que eu citei permite isso. Ruby, assim com Javascript, permite modificar os tipos básicos.
Javascript é uma linguagem à frente de seu tempo, que ganhou um estigma de “simples e limitada”, o que não é, de maneira nenhuma.
Existe algo parecido no .net, chamado de Extensions Methods.