Как мне создать пространство имен в JavaScript? - PullRequest
1 голос
/ 01 июня 2011

Я хочу получить доступ к переменным с помощью

MyNamespace.variable1

, которые доступны по всему миру.Я полагаю, что Drupal делает нечто подобное, нет?

Ответы [ 4 ]

4 голосов
/ 01 июня 2011
var MyNamespace = {};
MyNamespace.variable1 = value1;

Это просто объект на самом деле.

3 голосов
/ 01 июня 2011

Drupal использует следующий код:

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);
    }
  });
};

// …

Используя аналогичный код, вы можете эмулировать пространства имен с помощью JavaScript.

3 голосов
/ 01 июня 2011

Кроме того, если у вас есть много JS-файлов, каждый из которых добавляет «пространство имен» или Object в пакет верхнего уровня, вы можете делать такие вещи:

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
}

Тогда вы, конечно, можете просто позвонить им, как вам нужно Modules.A.myFunc() или Modules.B.myFunc() или Modules.B.instnaceVar = 20;.Таким образом, вы можете инкапсулировать функции, а также переменные.

Для моего кода я хотел бы иметь корневой объект (т.е.), а затем добавить к нему «классы» (объекты), чтобы у всех был красивый «пакет», например"," ООП "структура к нему.

2 голосов
/ 01 июня 2011

Просто создайте объект. E.g.:

var MyNamespace = {};
MyNamespace.variable1 = ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...