繁体   English   中英

动态名称空间模块模式

[英]Dynamic namespace module pattern

有没有人知道模式是什么能够创建模块模式,但能够设置模块动态存在的名称空间。

所以不是以下内容: -

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

  function privateMethod() { 
      // ... 
  } 

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

  return my; 
}());

MODULE可以设置为你喜欢的任何东西,我记得看到它是通过截屏播出但不记得在哪里......

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

我知道这在原始问题之后还有很长的路要走。 而且我不确定拥有动态命名的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('script')[document.getElementsByTagName('script')。length-1] .attributes ['namespaceName']。value]用于从脚本加载中提取属性namespaceName

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM