Ir al contenido principal

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()
};

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

Publicar un comentario

Entradas populares de este blog

Formatear fecha JSON

Para poder representar de forma bonita y humana una fecha retornada por un JSON por ejemplo, la función quedaría tal que así. En mi caso, el formato esperado es: dd/MM/yyyy hh:mm

function FormatDate(fecha) { var fechaObj = new Date(fecha); return (fechaObj.getDate() < 10 ? '0' : '') + fechaObj.getDate() + '/' + (fechaObj.getMonth() < 10 ? '0' : '') + fechaObj.getMonth() + '/' + fechaObj.getYear() + ' ' + (fechaObj.getHours() < 10 ? '0' : '') + fechaObj.getHours() + ':' + (fechaObj.getMinutes() < 10 ? '0' : '') + fechaObj.getMinutes(); };

Generar números aleatorios con Postgres

Muchas veces nos encontraremos con que tenemos que poblar una BD con numeros para poder testear un funcionalidad que estemos programando. En postgres es tan sencillo como:

update schema.tabla set columnaNumerica = floor(random() * N) + desviacion;
Con desviación me refiero a que, si no lo añadimos, random generara numeros empezando por el 0 hasta N. El uso de floor es para redondear y quedarme solo con la parte entera. Ya que random genera floats entre 0 y 1.

Espero os sirva este pequeño truquillo. Un saludico.