2011-05-31 2 views
1

Je veux accéder à des variables en utilisantComment créer un espace de noms en JavaScript?

MyNamespace.variable1 

qui sont globalement accessibles. Je crois que Drupal fait quelque chose de similaire, non?

+0

duplication possible de [Javascript Namespace Declaration] (http://stackoverflow.com/questions/881515/javascript-namespace-declaration) – haylem

Répondre

3

Qu'est-ce que Drupal fait est en utilisant le code suivant:

var Drupal = Drupal || { 'settings': {}, 'behaviors': {}, 'locale': {} }; 

Drupal.attachBehaviors = function (context, settings) { 
    context = context || document; 
    settings = settings || Drupal.settings; 
    // Execute all of them. 
    $.each(Drupal.behaviors, function() { 
    if ($.isFunction(this.attach)) { 
     this.attach(context, settings); 
    } 
    }); 
}; 

Drupal.detachBehaviors = function (context, settings, trigger) { 
    context = context || document; 
    settings = settings || Drupal.settings; 
    trigger = trigger || 'unload'; 
    // Execute all of them. 
    $.each(Drupal.behaviors, function() { 
    if ($.isFunction(this.detach)) { 
     this.detach(context, settings, trigger); 
    } 
    }); 
}; 

// … 

En utilisant un code similaire, vous pouvez émuler namespaces en utilisant JavaScript.

2

Créez simplement un objet. .: par exemple

var MyNamespace = {}; 
MyNamespace.variable1 = ... 

+0

Où puis-je déclarer ceci ... dans un espace global? – Shamoon

+0

Vous pouvez forcer global à partir de n'importe où en l'affectant à 'window', par ex. 'window.MyNamespace = {}' – Matt

+0

Juste pour être complet. JavaScript peut s'exécuter dans des environnements où il n'y a pas de DOM ou 'window', donc ne supposez pas toujours que vous pouvez l'utiliser. Je voudrais juste le définir dans l'espace global sans la «fenêtre». – Halcyon

4
var MyNamespace = {}; 
MyNamespace.variable1 = value1; 

Il est juste un objet vraiment.

3

En outre, si vous avez beaucoup de fichiers JS que chaque ajouter un « espace de noms » ou un objet dans un package de niveau supérieur, vous pouvez faire des choses comme ceci:

ModuleA.js

// if Modules is null, create a new object, else use the currently defined instance 
var Modules = Modules || {}; 

Modules.A = {}; 

// sample instance variable 
Modules.A.instanceVar; 

// sample function 
Modules.A.myFunc = function(param1, param2) { 
    // do something 
} 

ModuleB.js

// if Modules is null, create a new object, else use the currently defined instance 
var Modules = Modules || {}; 

Modules.B = {}; 

// sample instance variable 
Modules.B.instanceVar; 

// sample function 
Modules.B.myFunc = function(param1, param2) { 
    // do something 
} 

Ensuite, vous pouvez bien sûr les appeler comme vous les avez besoin Modules.A.myFunc() ou Modules.B.myFunc() ou Modules.B.instnaceVar = 20;. Vous pouvez donc encapsuler des fonctions ainsi que des variables.

Pour mon code, j'aime avoir un objet racine, (c'est-à-dire) et y ajouter des "classes" (objets) pour que tout ait une belle structure "OOP".

Questions connexes