2010-09-23 3 views
3

Quelle est la bonne façon de déclarer un espace de noms? Je viens de lire « développement de grandes applications Web » et l'auteur suggère d'utiliser:Déclaration de l'espace de noms Javascript

if (!window.YourNamespace) { 
    YourNamespace = {}; 
} 

semble assez facile .. mais je vois toutes les bibliothèques javascript pour déclarer espaces de noms et d'autres méthodes. N'y a-t-il pas un moyen standard de le faire? Des problèmes avec ce qui précède?

+0

Il est pratique actuellement plus commune pour les développeurs JavaScript pour utiliser un format de module ci-joint au lieu de définir des objets sur la portée globale. L'utilisation de chargeurs de modules tels que [require.js] (http://requirejs.org/) aide à cela. Il existe deux formats de modules différents à prendre en compte: AMD et/ou CommonJS, et vous pouvez en lire plus sur le blog [Rédaction de Javascript modulaire par Addy Osmani] (http://addyosmani.com/writing-modular-js/) . – Spoike

Répondre

0
var Utils = { 
     namespace : function(name) { 
       return window[name] = window[name] || {}; 
     } 
    }; 

ou si vous préférez votre utilisation de façon:

if (typeof window.YourNamespace === 'undefined') { 
    YourNamespace = {}; 
} 
+0

Pourquoi la deuxième façon est-elle meilleure que la façon dont j'ai posté ci-dessus? comment fonctionne la première façon? Je suis un peu confus. Utils est l'espace de noms et c'est un tableau associatif constitué d'une fonction? –

+0

désolé aurait dû clarifier cela.La classe Utils ci-dessus est plus agréable car vous pouvez l'utiliser comme suit: Utils.namespace ("myGreatNewNamespace"); –

+0

la seconde est meilleure car l'événement en testant pour! Window.YourNamespace attrapera le cas par défaut ne l'attrapera pas s'il y a une variable globale YourNamespace = 1; et écrasera YourNamespace = 0; Vous devriez toujours tester pour undefined si vous voulez undefined. Utilisez également === au lieu de == dans ces cas. –

0

Il n'y a pas de manière standard comme vous le verrez entre les frameworks mais ils vont au-delà des bases pour que par exemple X.Y.Z, il créera tous les objets de cette chaîne s'ils n'existent pas déjà.

+0

Quel est le framework d'espace de noms le plus populaire? –

+0

Cadre de l'espace de noms? – Lloyd

2

Je l'ai vu cette convention a utilisé plusieurs endroits.

window.YourNamespace = window.YourNamespace || {}; 
+0

version simplifiée de ce que j'ai écrit plus tôt. –

2

La méthode de déclaration d'espace de noms mentionnée par l'auteur du livre est en effet assez bonne. Mais quand vous avez besoin de le répéter dans plusieurs fichiers et l'espace de noms a plusieurs subnamespaces, il peut être assez fastidieux:

if (!window.Foo) { 
    Foo = {}; 
} 
if (!window.Foo.Bar) { 
    Foo.Bar = {}; 
} 
if (!window.Foo.Bar.Baz) { 
    Foo.Bar.Baz = {}; 
} 
etc... 

Au lieu de cela, vous devriez écrire une fonction simple qui prend soin de déclarer les espaces de noms pour vous:

function namespace(ns) { 
    var parts = ns.split(/\./); 
    var obj = window; 
    for (var i=0; i<parts.length; i++) { 
    var p = parts[i]; 
    if (!obj[p]) { 
     obj[p] = {}; 
    } 
    obj = obj[p]; 
    } 
} 

maintenant, vous pouvez déclarer l'ensemble espace imbriqué avec une seule ligne:

namespace("Foo.Bar.Baz"); 

Dans le cadre ExtJS cela est essentiellement ce que la fonction Ext.ns() fait. Je ne connais pas vraiment d'autres bibliothèques.

0

bob.js poignées namespaces comme ceci:

bob.ns.setNs('YourNamespace', { 

    /*define your members here. e.g.:*/ 
    method1: function() { /*...*/ } 
}); 


// now, merge another, sub-namespace. 
bob.ns.setNs('YourNamespace.YourSubNamespace', { 

    method2 function() { /*...*/ } 
}); 

//call methods: 
YourNamespace.method1(); 
YourNamespace.YourSubNamespace.method2(); 
0

Automatiser déclaration namespaces en javascript est très simple que vous pouvez voir:

var namespace = function(str, root) { 
    var chunks = str.split('.'); 
    if(!root) 
     root = window; 
    var current = root; 
    for(var i = 0; i < chunks.length; i++) { 
     if (!current.hasOwnProperty(chunks[i])) 
      current[chunks[i]] = {}; 
     current = current[chunks[i]]; 
    } 
    return current; 
}; 

// ----- USAGE ------ 

namespace('ivar.util.array'); 

ivar.util.array.foo = 'bar'; 
alert(ivar.util.array.foo); 

namespace('string', ivar.util); 

ivar.util.string.foo = 'baz'; 
alert(ivar.util.string.foo); 

Essayez-: http://jsfiddle.net/stamat/Kb5xY/ Blog post: http://stamat.wordpress.com/2013/04/12/javascript-elegant-namespace-declaration/

-1

Quelques exemples de fonction d'espace de nommage:

namespace = function(ns){ 
    arr = ns.split(".") 
    parent = window 

    var temp 

    while((temp = arr.shift()) !== undefined){ 
     parent[temp] = parent[temp] || {} 
     parent = parent[temp] 
    } 
} 

Vous pouvez alors l'utiliser comme:

namespace("your.own.namespace") 

your.own.namespace.Car= function() { 

    this.speed = 30; 

} 
+0

Cette question ne contient aucune information qui n'est pas déjà fournie par au moins l'une des autres réponses. En outre, il ne répond pas vraiment à la question. –

Questions connexes