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.