Cuando necesités una sola instancia de una clase de JavaScript, no te molestés escribiendo un constructor, escribí un solo JSON.
El gran poder de los objetos es que los datos y las funciones que hacen algo pueden estar encapsuladas en un mismo objeto. Así que aprovechandonos de ello y para seguir buenas prácticas, a veces metemos todas las utilidades necesarias al “desnudo” en el namespace global. Algo así:
function getElementsByClassName(cssClassName) {...}
Aunque en esto veo dos problemas:
Podemos crear una clase de utilidades que nos sirva para encapsular esta función (y otras) más o menos así:
function DomUtilityBag() {
this.getByClass= function(cssClassName) {...}
}
e instanciarla:
var domUtils = new DomUtilityBag();
Si has usado constructores, parece obvio y familar no?. Pero los constructores fueron hechos para permitir instanciar cualquier número de objetos del mismo prototype. Por qué necesitaríamos hacer eso con un conjunto de utilidades misceláneas? Usualmente no hay razón, porque no hay datos que se diferencien de una instancia a otra.
Acá entra Singleton y es donde JSON se vuelve muy útil. Con él podemos declarar una única instancia y todos sus miembros de una sola llamada, sin meternos con los constructores:
var domUtils = {
getByClass: function(cssClassName) {...}
}
Mientras estamos haciendo el domUtils asumamos que esa librería de utilidades podría crecer bastante (siempre lo hacen). Así que vamos a seguir la técnica de YUI para el namespacing, categorizando más las utilidades, y como solo necesitamos una copia, utilizamos JSON para hacerlo. Acá está el esqueleto de mi librería, y le vamos a poner… eeehh, hmm… ZAQ, sí ZAQ:
var ZAQ = {} //esto crea un objeto namespace vacío
ZAQ.util = {} //un sub-objeto para el paquete de utilidades
//lo granulamos más, con utilidades específicas para el DOM
ZAQ.util.dom = {
getByClass: function(cssClassName) {...},
elemHasClass: function(elem, className) {...}
}
//podemos agregar más tipos de utilidades en sus propias "categorias"
ZAQ.util.array = {
contains: function(theArray, match) {...}
}
ZAQ.util.string = {
startsWith: function(theString, match) {...},
endsWith: function(theString, match) {...}
}
Y así sucesivamente.
Necesitamos una?
Ok, ok… El fín es que podés usar el poderoso patrón singleton en JavaScript, funciona perfecto para este tipo de librerías de utilidades y un sin fín de cosas más en las que solo necesités una copia corriendo. Mantiene el código fácil de leer, mantiene el namespace intacto y ordenado y además previene colisiones con otras funciones cuando estás integrando otras librerías.
Que te sirva de algo.