Шаблон модуля динамического пространства имен - PullRequest
3 голосов
/ 13 февраля 2011

Кто-нибудь знает, что такое шаблон для возможности создания шаблона модуля, но с возможностью установить пространство имен, в котором модуль живет динамически.

Итак, вместо того, что ниже: -

var MODULE = (function () { 
  var my = {}, 
      privateVariable = 1; 

  function privateMethod() { 
      // ... 
  } 

  my.moduleProperty = 1; 
  my.moduleMethod = function () { 
      // ... 
  }; 

  return my; 
}());

МОДУЛЬ может быть настроен на все, что угодно, я помню, как я делал это, например, показ экрана, но не могу вспомнить, где ...

По сути, я хотел бы создать библиотеку, которая могла бы бытьприсваивается любому пространству имен, которое нравится разработчику.

Ответы [ 3 ]

0 голосов
/ 31 марта 2011

Забавно встретить это сейчас, я просто создал новую базу кода таким образом. Вот как я подошел (это зависит от 1 дополнительной глобальной переменной):

// ability to rename namespace easily
var AXS_NS = 'App';

window[AXS_NS] = (function (app, $, Modernizr) {

    app.config = {
        debug: false
    };

    app.init = function() {
        console.log('init');
    };

    return app;

})(window[AXS_NS] || {}, jQuery, Modernizr);

Тогда вы можете сделать:

jQuery(function($){
    App.init();
});
0 голосов
/ 14 марта 2016

Я знаю, что это долгий путь после первоначального вопроса. И я не уверен в актуальности наличия динамически именуемого объекта javascript. Но следующий шаблон делает это разумным способом, позволяя вам установить имя пространства имен объекта в элементе script вашей HTML-страницы.

Что-то вроде

<script src="js/myscript.js" namespaceName="myObject"><script>

Что позволяет вам затем вызывать myObject.hello() в вашем JavaScript.

Пример javascript, который использует это решение.

/**
 * Dynamic mechanism for setting a javascript namespace.
 * 
 * This works by adding the namespaceName as an attribute to the script
 * element on your page.  Something like
 *
 *  **<script src="js/myscript.js" namespaceName="myObject"><script>**
 *
 * When the script has loaded it will have created a new javascript object
 * with the nemespace name "myObject".
 *
 * You can now use myObject.hello() which returns "ns.hello() called"<br/>
 * 
 * This works on later versions of chrome, firefox and ie.
 */
(function (ns) {
    ns.hello = function () {
        return "ns.hello() called";
    }
} (window[document.getElementsByTagName('script')[document.getElementsByTagName('script').length-1].attributes['namespaceName'].value]=
        window[document.getElementsByTagName('script')[document.getElementsByTagName('script').length-1].attributes['namespaceName'].value] || {}));

The Окно [document.getElementsByTagName ( 'сценарий') [Document.getElementsByTagName ( 'Скрипт'). Длина-1] .attributes [ 'NamespaceName']. значение] Используется для получения значения атрибута namespaceName из скрипта загрузки

0 голосов
/ 13 февраля 2011

Я думаю, вы сможете добавить метод, который позволит вам установить его, и обнулить MODULE.

http://jsfiddle.net/yrsdR/

my.namespace = function( ns ) {
    window[ns] = my;
    window.MODULE = null;
}

, то:

window.MODULE.namespace( "myNamespace" );

window.MODULE; // null
window.myNamespace // object

или вы можете вернуть его в любую переменную, которую вы хотите.

http://jsfiddle.net/yrsdR/1/

my.namespace = function() {
    window.MODULE = null;
    return my;
}
window.myNamespace = MODULE.namespace();

window.MODULE; // null
window.myNamespace // object
...