动态名称空间模块模式

时间:2011-02-13 01:53:54

标签: javascript dynamic namespaces

是否有人知道该模式能够创建模块模式,但能够动态设置模块所在的名称空间。

所以不是下面的内容: -

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

  function privateMethod() { 
      // ... 
  } 

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

  return my; 
}());

MODULE可以设置为你喜欢的任何东西,我记得在屏幕录像中看到它完成但却记不起来......

基本上我想创建一个可以分配给实现者喜欢的任何命名空间的库。

3 个答案:

答案 0 :(得分:0)

我认为你只能添加一个方法来设置它,并使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

答案 1 :(得分:0)

现在有趣的是,我只是以这种方式建立了一个新的代码库。这就是我接近它的方式(但它取决于一个额外的全局变量):

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

答案 2 :(得分:0)

我知道在原始问题之后还有很长的路要走。而且我不确定拥有动态命名的javascript对象的相关性。但是,以下模式允许您在html页面的script元素中设置对象命名空间名称,这是一种合理的方法。

这样的东西
<script src="js/myscript.js" namespaceName="myObject"><script>

然后,您可以在javascript中调用myObject.hello()

使用此解决方案的示例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] || {}));

在     窗口[document.getElementsByTagName(&#39;脚本&#39;)     [document.getElementsByTagName(&#39;脚本&#39)。长度-1]     .attributes [&#39; namespaceName&#39]。值] 用于从脚本加载

中提取属性 namespaceName