lunes, 2 de enero de 2012

Métodos estáticos en javascript

Como sigo metido con OO en JavaScript, hoy me he visto en la necesidad de crear un método estático, a continuación os digo como:
function MiClase() {
  // Constructor
}

MiClase.MetodoEstatico = function () {
  // Metodo estatico, no se puede invocar con new MiClase().MetodoEstatic()
};

4 comentarios:

  1. Buen día Rogelio.
    ¿Como puedo hacer para evitar que los métodos estáticos se copien a las instancias de cada objeto creado a partir de la clase?

    ResponderEliminar
    Respuestas
    1. Buena pregunta. He estado haciendo averiguaciones, y cuando instancias un objeto, dentro de este existe la propiedad __proto__, que según la documentación de mozilla y lo que he entendido, no es mas que una referencia al constructor. Por lo tanto no son copias lo que ves sino referencias al mismo objeto.

      Te dejo el enlace para que veas el ejemplo con más claridad: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/proto

      Si estoy equivocado házmelo saber, que uno no nace enseñado, jejeje

      Eliminar
  2. Buenas Rogelio,

    Desconozco lo que comentas de la propiedad __proto__ (yo también estoy aprendiendo), pero si se que para que los métodos estáticos no se copien, se han de asignar con prototype:

    objeto2.prototype.miMetodo = function(){
    ...
    };

    Te dejo un enlace:
    http://www.wextensible.com/temas/javascript-eficiente-objetos/metodos-prototipo.html,

    Saludos!

    ResponderEliminar
  3. Claro, tal y como me comentas en el enlace que me has dejado. Para evitar duplicidad tiene que estar dentro del atributo prototype.

    Pero el problema que tu tienes, es que para usar miMetodo tienes que hacer previamente una instancia de la clase, es decir, un new MiClase().

    Lo que se pretende con el método estático, es evitar hacer el new MiClase() (crear una instancia de la clase) y llamarlo simplemente con MiClase.miMetodo().

    No confundas clase con objeto, es básico de programación orientada a objetos.

    Ademas, según te indico, si ves el inspector de script que te proporciona Chrome o Firebug, el método estático esta dentro del atributo prototype o __proto__ (es lo mismo). Y tal y como indica tu enlace, eso quiere decir que no se esta duplicando el método.

    ResponderEliminar