viernes, 13 de septiembre de 2013

fechas y POO en Javascript

El siguiente ejemplo, trata sobre fechas y Programación orientada a objetos en Javascript.


El ejemplo expuesto, es una clase sencilla con funciones básicas de fecha que se pueden encontrar fácilmente en google, no obstante se exponen en una clase para usarlas cómodamente, y con el objetivo de explicar los conceptos básicos de POO en Javascript, aspecto poco utilizado en este lenguaje.



 
var fech = new classFecha(new Date());
console.log(fech.DiaLargo());

function classFecha(date) {
    var diasSem = new Array("Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado");

    var meses = new Array("Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre");


    this.DiaSemana = function () { return diasSem[date.getDay()]; }

    this.Mes = function () { return meses[date.getMonth()]; }

    this.DiaLargo = function () { return this.DiaSemana() + ", " + date.getDate() + " de " + this.Mes() + " de " + date.getFullYear(); }


    this.LunesSemana = function () {
        if (date.getDay() != 0)
            return (date.getDate() + (6 - (7 + (date.getDay() - 2))));
        else
            return (date(date.getDate() - 6));
    };
}

Bien, ahora vamos a comentarlo por partes, que hay mucho que comentar.

 ¿Que es function classFecha? Pués es la definición de una clase en Javascript, estás se definen como funciones.

 Diferencia entre variables definidas como var y this: las definidas como var son campos privados. Las definidas como this son propiedades o métodos públicos.

 Pero, ¿Propiedades o métodos?: Esto es otra cuestión, en general las propiedades, se definen como function, en ese caso siendo puristas son métodos/funciones públicos. Pero se pueden definir como propiedades puras de la siguente forma, por ejemplo:
 DiaSemana: En lugar de, 

this.DiaSemana = function () { return diasSem[date.getDay()]; }

 Codificaríamos,
          this.DiaSemana = (diasSem[date.getDay()]); 

 Y luego la llamaríamos así:  fech.DiaSemana
  En lugar de así: fech.DiaSemana()

 En la mayoría de ejemplos las propiedades son métodos definidas como funciones anónimas, es una costumbre en javascript debido a su sintaxis.


Todavía más cuestiones:

Los más puristas en POO se preguntarán,

¿Y porqué declara métodos de instancia si es una clase sin estados? Cierto, no se están utilizando estados, lo lógico desde un enfoque POO sería definir los métodos como estáticos.
Una razón es para que esté preparada para extenderse añadiéndole propiedades de estado.
Otra razón, y la principal,  es que no me gusta la sintaxis de los métodos estáticos en javascript.

Ese link la explica: http://mistrastadas.blogspot.com.es/2012/01/metodos-estaticos-en-javascript.html


Como podeis ver en el primer link, para definir un método estático hay que sacarlo fuera de la clase y añadirlo con la notación nombreClase.nombreFuncion=(...);  

El segundo link aún tiene otro tema, como añadir propiedades a un objeto en tiempo de ejecución con la clase prototype. No lo vuelvo a explicar pués ya está explicado en el link. En definitiva viene a ser un análogo a los métodos de extensión de C#, pués lo que se consigue así es extender la clase.

2 comentarios:

  1. Creo que de esa forma estás siendo poco eficiente, porque cada vez que creas un nuevo objeto con "new classFecha()" estas duplicando variables y métodos que son comunes.

    Por qué no usas el prototype para las cosas que no cambian entre instancias?

    Por ejemplo:

    classFecha.prototype.diasSem = new Array("...")

    Saludos.

    ResponderEliminar
  2. Buena apreciación,
    Ya comento en el Post que los métodos del ejemplo son susceptibles de ser tratados y por tanto declarados como estáticos, y pongo un link de ejemplo.

    ResponderEliminar