2010-11-10 28 views
8

Pour mon application Web, je crée un espace de noms en JavaScript comme ceci:Comment créer des variables privées dans un espace de noms?

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

Je veux aussi créer « privé » (je sais que cela n'existe pas dans JS) des variables d'espace de noms, mais ne suis pas sûr de ce qui le meilleur modèle de conception à utiliser.

Serait-il:

com.example._var1 = null; 

Ou serait autre chose le modèle de conception?

+2

Par "super" voulez-vous dire "créer"? – kennytm

+0

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

+0

@casablanca, non - ma question n'est pas un doublon de ce que vous avez lié aussi. – StaceyI

Répondre

8

Closures sont fréquemment utilisés comme ceci pour simuler des variables privées:

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

Pour ajouter à cette réponse: Cet article décrit quelques variantes du modèle de module que vous devriez considérer. http://www.adequatelygood.com/2010/3/JavaScript-Module-Pattern-In-Depth –

7

Douglas Crockford a popularisé ce qu'on appelle Module Pattern où vous pouvez créer des objets avec des variables "privées":

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 

Mais comme vous l'avez dit Javascript n'a pas vraiment de variables privées et je pense que c'est un peu un jeu d'enfant, qui brise d'autres choses. Essayez simplement d'hériter de cette classe, par exemple.