2010-11-10 18 views
8

Para mi aplicación web, estoy creando un espacio de nombres en JavaScript, así:¿Cómo crear variables privadas dentro de un espacio de nombres?

var com = {example: {}}; 
com.example.func1 = function(args) { ... } 
com.example.func2 = function(args) { ... } 
com.example.func3 = function(args) { ... } 

también quieren crear "privado" (sé que esto no existe en JS) las variables de espacio de nombres, pero no estoy seguro de lo que está el mejor patrón de diseño para usar.

¿Sería:

com.example._var1 = null; 

O sería el patrón de diseño ser otra cosa?

+2

¿Por "grande" quiere decir "crear"? – kennytm

+0

posible duplicado de [JavaScript Namespace Declaration] (http://stackoverflow.com/questions/2504568/javascript-namespace-declaration) – casablanca

+0

@casablanca, no, mi pregunta no es un duplicado de lo que ha vinculado también. – StaceyI

Respuesta

8

Los cierres se utilizan con frecuencia como esto para simular variables privadas:

var com = { 
    example: (function() { 
     var that = {}; 

     // This variable will be captured in the closure and 
     // inaccessible from outside, but will be accessible 
     // from all closures defined in this one. 
     var privateVar1; 

     that.func1 = function(args) { ... }; 
     that.func2 = function(args) { ... } ; 

     return that; 
    })() 
}; 
+2

Para agregar a esta respuesta: Este artículo describe algunas variaciones diferentes del patrón del módulo que debes considerar http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth –

7

Douglas Crockford popularizado los llamados Module Pattern donde se puede crear objetos con las variables "privadas":

myModule = function() { 

     //"private" variable: 
     var myPrivateVar = "I can be accessed only from within myModule." 

     return { 
       myPublicProperty: "I'm accessible as myModule.myPublicProperty" 
       } 
     }; 

}(); // the parens here cause the anonymous function to execute and return 

Pero como bien dice JavaScript realmente no tiene variables privadas y creo que esto es un poco un problema, que rompe otras cosas. Solo trata de heredar de esa clase, por ejemplo.

Cuestiones relacionadas