Contenido

Sobrecarga en Javascript

13 Nov

+ 4

La sobrecarga en programación orientada a objetos nos permite tener definidas diferentes funciones con el mismo nombre, pero diferente número de parámetros. Algo muy util para poder procesar datos de diferentes formas sin perder la lógica de la clase.

//Java
public class miClase {

    private String nombre = new String("Mi Nombre");

    public String devuelveNombre() {
        return this.nombre;
    }

    public String devuelveNombre(String nuevoNombre) {
    		this.setNombre(nuevoNombre);
        return this.nombre;
    }

    private void setNombre(String nuevoNombre) {
    	this.nombre = nuevoNombre;
    }

}
//ADA
declare
  type TAlimento is (PAN, LECHE, ACEITE);
  type TProducto_Automóvil is (ACEITE, BUJÍA);
  procedure Comprar (ProdAlim: TAlimento) is  -- ...
  procedure Comprar (ProdAutom: TProducto_Automóvil) is  -- ...
begin
  Comprar (ACEITE);  -- Ambigüedad.
  Comprar (TAlimento'(ACEITE));  -- Se supera la ambigüedad.
  Comprar (ProdAlim => ACEITE);  -- También se supera la ambigüedad.
end;

Hace tiempo que desde Javascript podemos hacer esto usando la variable arguments, disponible dentro de todas las funciones y que nos informa del número de argumentos que le pasamos a una función. 

//Javascript
var miClase = new Object();
miClase.nombre = "Mi Nombre";

miClase.devuelveNombre = function() {
	if (arguments.length == 1) this.setNombre(arguments[0]);
	return this.nombre;
};

miClase.setNombre = function(nuevoNombre){
	this.nombre = nuevoNombre;
}

alert(miClase.devuelveNombre("Mas otro"));

John Resig, ha desarrollado un sistema más elegante con el cual mediante una función, podemos conseguir esto de una forma aún más fácil.

//Javascript
// addMethod - By John Resig (MIT Licensed)
function addMethod(object, name, fn){
    var old = object[ name ];
    object[ name ] = function(){
        if ( fn.length == arguments.length )
             return fn.apply( this, arguments );
         else if ( typeof old == 'function' )
            return old.apply( this, arguments );
     };
}

Con esta función, añadir métodos a nuestros objetos será tan fácil como esto:

//Javascript
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
  });
}

O mejor aún, lo añadimos como un método nuevo del objeto Object(), así podremos usarlo en cualquier objeto de nuestra aplicación de la siguiente forma.

//Javascript
Object.prototype.addMethod = function (name, fn){
    var old = this[ name ];
    this[ name ] = function(){
        if ( fn.length == arguments.length )
             return fn.apply( this, arguments );
         else if ( typeof old == 'function' )
            return old.apply( this, arguments );
     };
}

var p = new Object();

p.addMethod("alert", function() { alert("hola");});
p.addMethod("alert", function(a){ alert(a);});

p.alert();
p.alert("que te pasa??");
  • John Resig, ha desarrollado un sistema más elegante con el cual mediante una función, podemos conseguir esto de una forma aún más fácil.

    Bueno, hace mucho que existe esto en casi todos los frameworks como prototype o mootools y supongo que en jQuery. Sobre todo desde javascript 1.3 y la entrada de apply() y call()
    Yo haría gala de los méritos hacia Douglas Crockford, por esta implementación 😉

  • Exacto frenadoll, Douglas inició este tema, pero John ha desarrollado la función que comento.

    Los frameworks, usan sistemas similares pero te obligan a tener más funcionalidades que generalmente no usas, por ese motivo me gusta tener estas funciones por separado para usar lo que quiero, cuando quiero.

    Me hago mis propios frameworks para cada aplicación que hago. 😀

  • Esto no es más que un simple implement de funciones para prototiparlas, pero sí, tienes razón.

  • Excelente aporte. A mi también me gusta usar sólo las funciones que necesito en cada sitio y no toda una librería. Además me gusta ver así las funciones para aprender y no quedarme sólo en como manejar una librería concreta, ¿ya hablaste una vez del tema? 😉 Por esto último soy asiduo de la página http://www.cross-browser.com/ en la que te puedes encontrar funciones que hacen lo que necesitas sin necesidad de añadir toda una librería.

Comentar

#

Me reservo el derecho de eliminar y/o modificar los comentarios que contengan lenguaje inapropiado, spam u otras conductas no apropiadas en una comunidad civilizada. Si tu comentario no aparece, puede ser que akismet lo haya capturado, cada día lo reviso y lo coloco en su lugar. Siento las molestias.