06/04/2012 Development / java script

Extender métodos no javascript é muito fácil e muito útil para coisas que são corriqueiras. Exemplo: métodos trim, capitalize, bold, reverse e métodos que podem ser especificos de uma classe Utils.js dentro do seu projeto

Por exemplo, se a gente fosse fazer uma extensão para deixar uma string sempre com a primeira letra em maiuscula.

var string = "yes";

if(!String.prototype.capitalize)
{
    String.prototype.capitalize = function()
    {
        return this.slice(0,1).toUpperCase() + this.slice(1).toLowerCase();
    }
}

Tranquilo né! Só que temos uma inconveniente nesse código.

for(i in string) console.log(i + ":" + string[i]);

Resultado:

1) y
2) e
3) s
4) function ....

Nesse caso, imagina que você tenha que fazer um for, teria que ficar validando se é realmente string ou function, estranho né!

A solução: Vamos usar o Object.defineProperty

Ele incrementa ou altera um método ao objeto passado. Mais detalhes - https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty

if(!String.prototype.capitalize)
{
    Object.defineProperty(String.prototype, 'capitalize',
    {
       value: function()
       {
           return this.slice(0,1).toUpperCase() + this.slice(1).toLowerCase();
       },
       enumerable: false
    });
}

alert(string.capitalize());

for(i in string) console.log(i + ":" + string[i]);

Resultado:

1) y
2) e
3) s

Espero que sirva!