November 16th, 2007

Sobrecarga de métodos en javascript (II)

Siguiendo la linea del post anterior (Sobrecarga de métodos en javascript), dejo otra forma de hacer lo mismo, ahora sin usar recursión para buscar la función correcta, por lo que la degradación de performance no debería crecer con el número de sobrecargas

// addMethod - By Pablo Viojo (MIT Licensed), based on addMethod by John Resig (MIT Licensed)
function addMethod(object, name, fn){

    if ( !object[ name ] )
     object[ name ] = function(){
       if ( object[ "_ovld_"+name+"_"+arguments.length ] ){
         return object[ "_ovld_"+name+"_"+arguments.length ].apply( this, arguments )
       }
       return null;
     } 

    object[ "_ovld_"+name+"_"+fn.length ] = fn;

}

// Now setup the methods
function Users(){

  addMethod(this, "find", function(){
  // Find all users...
  });

  addMethod(this, "find", function(name){
    // Find a user by name
  });

  addMethod(this, "find", function(first, last){
    // Find a user by first and last name
  });
}

// Now use the methods
var users = new Users();
users.find(); // Finds all
users.find("John"); // Finds users by name
users.find("John", "Resig"); // Finds users by first and last name
users.find("John", "E", "Resig"); // Does nothing

Lo que se hace en este caso es crear una función, solamente cuando se hace la primera definición, con el nombre de la sobrecargada (ej: find), y una funcion de nombre “_ovld_{nombre de la funcion}_{numero de argumentos}” (ej: _ovld_find_1, _ovld_find_2) que es la función real a ejecutar. Al invocar la funcion (find) esta se encarga, en función del numero de parametros de invocar a la función sobrecargada si esta existe.

Lo he probado con IE 6, y Firefox 2 sin problemas, si alguien lo utiliza en otro ambiente y funciona o falla, agradezco lo comente

Tags: ,

One Comment Add your own

  • pviojo | November 16th, 2007 at 15:38


    Je, parece que olvidé publicar estos artículos cuando los escribí, y en estos momentos otros ya han tenido la misma idea, incluso mejorandola. Igualmente fue un buen ejercicio mental…

  • Leave a Reply

    XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

    (required)

    (required)

About

Mi nombre es Pablo Viojo y tengo 26 años. Nací en el Uruguay el 7 de agosto de 1981. Actualmente vivo en Santiago, Chile

Aparte de esto me interesa todo lo que tenga que ver con Internet y las nuevas tecnologías. Más info aquí, mi hCard, en formato FOAF

View Pablo Viojo's profile on LinkedIn



Recent Comments

Pages

Feeds

Posts by tags

Posts by month