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: javascript, programación


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>