2012-01-17 9 views
60

¿Se considera una mala práctica de codificación almacenar funciones en un objeto en lugar de simplemente definirlas (y, por lo tanto, globalmente)?Javascript - Función de almacenamiento en el objeto - ¿mala práctica?

considerar:

1.

Foo = { 
    bar: function() { 
     alert("baz"); 
    } 
} 

Foo.bar();

vs

2.

function bar() { 
    alert("baz"); 
} 

bar();

Claro, podría ser un código un poco menos para el segundo ejemplo, pero cuando comiences a obtener muchas funciones, se ensuciará. Lo encuentro mucho, mucho más limpio para, por ejemplo, usar Game.update() en lugar de usar updateGame(); o similar. Cuando se profundiza, como Game.notify.admin(id) y así sucesivamente, le da un código aún más bonito.

¿Hay algún inconveniente almacenando una función en un objeto?

+2

No. Si hubiera, marcos con millones de usuarios en todo el mundo no harían eso. – Jon

+2

No. Es un espacio de nombres estándar para evitar la contaminación global, como su pregunta ya ha señalado. ¿Por qué sería malo? –

Respuesta

56

Se prefiere el primer enfoque. De esta manera está definiendo explícitamente el alcance de sus funciones en lugar de contaminar el alcance global. No hay desventajas de usar el primer enfoque. Solo upsides :-)

Conclusión: utilice siempre el primer enfoque para definir funciones. El segundo es como javascript en los 90, dejémoslo en paz en el pasado y usemos el alcance adecuado.

+1

Hay algunos inconvenientes en la anidación agresiva. Poner _funciones_ en objetos "porque es mejor", por ejemplo, es estúpido. (poner funciones en el alcance global también es estúpido, pero eso no es lo que se estaba tratando, asume el alcance del módulo).También anidar objetos y funciones más allá de 4 capas de profundidad es absurdo. lo ideal es que desee una o dos capas para su cadena de objeto/método 'foo.bar.baz()' – Raynos

+2

¿Realmente se trata de alcance? ¿O se trata solo de reducir el número de variables globales para reducir la posibilidad de nombres de variables duplicados? ¿La "contaminación global" tiene ** cualquier ** efecto secundario adverso? – RobG

+0

@RobG mantenibilidad. Hay muchas buenas razones para intentar reducir el número de variables globales a cero. – Raynos

3

En este caso específico, vaya con el primero. Pero si el objeto Foo se vuelve realmente complejo, es posible que desee utilizar otro enfoque que le dé la oportunidad de usar un constructor. Y también el primer acercamiento a veces no es la mejor cuando se trata de alcance de la función:

function Foo(appName){ 
    this.name = appName;  
} 

Foo.prototype.Bar = function(){ 
    alert(this.name) 
} 

var a = new Foo("baz"); 
a.Bar(); 
+0

Anti patrón detectado. Por favor usa el prototipo, gracias. – Raynos

+0

Tienes razón @Raynos, el problema con declarar funciones dentro de una función es que se volverá a crear cada vez que inicies la clase. –

4

No hay magia con objetos de espacio de nombres, ni le necesariamente tener ningún problema si se utiliza una gran cantidad de variables globales. La razón principal para usar objetos de "espacio de nombres" es reducir el potencial de nombres de variables globales duplicados. Una segunda razón es agrupar funciones similares juntos por conveniencia, por ejemplo:

// Object example (suggested best practice): 
// DOM functions are under myLib.dom 
myLib.dom.someDOMFunction0; 
myLib.dom.someDOMFunction1; 

// Utility functions are under myLib.util 
myLib.util.someUtilityFunction0; 
myLib.util.someUtilityFunction1; 

Tenga en cuenta que lo anterior tiene prácticamente las mismas posibilidades de duplicados como variables de manera similar globales:

// Global variable example: 
myLib_dom_someDOMFunction0; 
myLib_dom_someDOMFunction1; 

myLib_util_someUtilityFunction0; 
myLib_util_someUtilityFunction1; 

Por supuesto que el primero es por lo general preferido porque es más fácil trabajar con él. No estoy defendiendo que adopte el segundo enfoque (yo uso el primero), solo señalando que si bien existe un problema con la creación de muchas variables globales, la llamada "contaminación del espacio de nombres global" está muy sobrevalorada como un peligro.

Cuestiones relacionadas