2010-08-18 6 views
4

En ce moment, je me sers de cette façon:Comment créer des fonctions statiques namespaced en Javascript?

window.Foo = { 
    alpha: function() {}, 
    bravo: function(arg) {} 
} 
window.Bar = { 
    charlie: function(arg) {} 
} 

Foo.alpha() 
Bar.charlie() 

Mais je soupçonne que ce n'est pas la « bonne » façon de faire les choses depuis (1) mon IDE selfs dans la compréhension de ce que je veux dire de plusieurs façons (par exemple, ne remplira pas automatiquement les noms de fonction si je tape Foo.) et (2) si je parcoure les espaces de noms, et que je renvoie simplement typeof eachone, j'obtiens String.

Répondre

4

Ce code:

for(var key in window.Foo) 
{ 
    // Code 
} 

attribue uniquement le nom de la propriété à la key variable, ce qui est une chaîne. Si vous avez besoin l'objet associé (ou la fonction), utilisez plutôt:

for(var key in window.Foo) 
{ 
    var obj = window.Foo[key]; 
    // Code using obj 
} 

Comme dit Matthew Flaschen, langages dynamiques tels que JavaScript sont difficiles à analyser, donc si votre IDE ne comprend pas quelque chose, ne pas s'inquiéter trop à ce sujet.

3

C'est très bien si vous n'avez pas besoin de variables privées. Les langages dynamiques sont difficiles à analyser, et votre IDE ne l'obtient pas.

Une alternative, surtout si vous avez besoin d'un champ de classe privée, est:

window.Foo = new (function(){ 
    var some_private; 
    this.alpha = function(){}, 
    this.bravo = function(arg){// use arg and some_private} 
})(); 

Quant à l'itération, je soupçonne que vous utilisez quelque chose comme:

for(var key in window.Foo) 
{ 
    print(typeof key); 
} 

Essayez:

for(var key in window.Foo) 
{ 
    print(typeof window.Foo[key]); 
} 
+2

Notez que 'pour chaque ... in' est une construction de Mozilla uniquement. Aussi 'for (key in window.Foo)' pourrait faire en sorte que 'key' soit déclarée comme une propriété sur l'objet global (et dans ES5 en mode strict, cela provoquera un' ReferenceError'), 'for (var key dans window.Foo) 'est recommandé à la place. – CMS

2

Essayez celui-ci. Peut-être que votre IDE traitera correctement

var Foo = { 
    test: function() {}, 
    test2: function() {} 
}; 

for(var prop in Foo) { 
    console.log(typeof Foo[prop]); // Will log 'function' 
} 

window.Foo = Foo; 
Questions connexes