RSS Feed

Extendiendo javascript: String.trim()

1

enero 10, 2012 by - @pjnovas

El famoso trim, que casi siempre esta presente, javascript no lo tiene (o por lo menos todavía). Vamos a usar ese tan necesario metodo para ver un poco como podemos extender nuestro javascript; pero es importante no utilizar una libreria, por ej: jQuery tiene $.trim() lo cual es muy útil, pero la idea no es referenciar una libreria por un método.

Function.prototype.nuevoMetodo = function(nombre, funcion) {
    if (!this.prototype[nombre]) {
        this.prototype[nombre] = funcion;
        return this;
    }
}

String.nuevoMetodo('trim', function(){
    return this.replace(/^\s+|\s+$/g, '');
});

var trimeado = '    hola'.trim();
console.log(trimeado); // 'hola'

Primero extendemos el objeto Function de javascript mediante prototype con una funcion nuestra que llamé nuevoMetodo, la cual recibe un nombre y una funcion. Lo primero que hacemos es comprobar que no lo tenga, como vimos en este post podemos acceder a propiedades de un objeto en forma de array, y ya que el valor undefined es falso podemos hacer la condición: Si no existe, lo agregamos. De esta manera estamos prototipando Function con una función generica para agregar métodos y extender nuestro javascript.

Ahora simplemente llamamos a nuevoMetodo desde String (ahora lo posee por herencia) y le agregamos la función trim, que basicamente es un regular expression que remueve los espacios.

Es una forma segura y limpia de extender nuestro javascript para casos especificos sin tener que hacernos una funcion colgada de una palmera.

Fuente: JavaScript: The Good Parts – Douglas Crockford


  • Anónimo

    Muy bueno, que malo era no tener el trim hace un tiempo ahora veo que ya está bastante soportado hacer ' bien '.trim(), por eso está bueno lo de no pisar la implementación original!
    Como lo hace jQuery para su función $.trim(string)?

    trim: trim ?
    function( text ) {
    return text == null ?
    "" :
    trim.call( text );
    } :

    // Otherwise use our own trimming functionality
    function( text ) {
    return text == null ?
    "" :
    text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
    }

    donde trimLeft = /^s+/ y trimRight = /s+$/

    Saludos