javascript - reveal - Patrón de módulo vs. instancia de un constructor anónimo
reveal pattern javascript (4)
Douglas Crockford writes sobre el segundo. Como Greg dice en sus comentarios, pensé que era bastante común, y lo he usado en el pasado.
Edición: para responder realmente a su pregunta: no hay inconvenientes, los dos son funcionalmente equivalentes (ambos crean un cierre que contiene las "variables privadas" y exponen otras variables / métodos públicamente), y tienen exactamente el mismo soporte de navegador y características de rendimiento. Simplemente se reduce a una cuestión de sintaxis: básicamente, cuando se pone el ()
para invocar esta función y obtener su cierre, y si se usa la new
palabra clave.
Así que hay este llamado patrón de módulo para crear singletons con miembros privados:
var foo = (function () {
var _foo = ''private!'';
return {
foo: function () { console.log(_foo); },
bar: ''public!''
}
})();
También hay este método que encontré por mi cuenta, pero no he visto nada escrito sobre:
var foo = new function () {
var _foo = ''private!'';
this.bar = ''public!'';
this.foo = function () { console.log(_foo); };
}
Estoy pensando que debe haber una razón por la cual nadie escribe sobre esto mientras hay toneladas de artículos sobre el patrón del módulo. ¿Hay algún inconveniente en este patrón? ¿Velocidad, o compatibilidad con el navegador tal vez?
En este caso, parece que está usando solo un objeto de instancia de esa "clase" . Por lo tanto, puede querer echar un vistazo a lo que Douglas Crockford piensa acerca de poner new
directamente en frente de la function
:
Mediante el uso de new para invocar la función, el objeto se aferra a un objeto
prototype
sin valor. Eso desperdicia memoria sin ventaja de compensación. Si no utilizamos el nuevo, no conservamos el objeto prototipo perdido en la cadena. Entonces, en lugar de eso, invocaremos la función de fábrica de la manera correcta, usando ().
Así que de acuerdo con el renombrado arquitecto javascript de Yahoo! Deberías usar el primer método, y tienes sus razones allí.
Más o menos, te dan el mismo resultado. Es solo una cuestión de qué camino quieres tomar para ello.
El 1er puede ser más popular ya que es simplemente la mezcla de 2 patrones ya comunes:
(function closure() {
var foo = ''private'';
/* ... */
}())
var singleton = {
bar : ''public''
};
Sin embargo, el prototype
encadenamiento sería el beneficio del segundo patrón, ya que tiene su propio constructor.
var singleton = new function Singleton() { };
assert(singleton.constructor !== Object);
singleton.constructor.prototype.foo = ''bar'';
assert(singleton.foo === ''bar'');
No veo ninguna diferencia sustancial entre los dos. Preferiría esto último simplemente porque tiene mucho menos desorden de puntuación.
Por otro lado, el enfoque de "patrón de módulo" parece ser el más común y se está convirtiendo en un patrón conocido (debido al aumento en JQuery). Podría ser mejor seguir este patrón reconocido, no porque tenga más mérito técnico que el otro enfoque, sino simplemente porque probablemente será más reconocible (a pesar de la gran puntuación).