【问题标题】:Dynamic namespace module pattern动态命名空间模块模式
【发布时间】:2011-06-26 07:11:52
【问题描述】:

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

所以不是下面的:-

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

  function privateMethod() { 
      // ... 
  } 

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

  return my; 
}());

MODULE 可以设置为您喜欢的任何内容,我记得在截屏视频中看到过它,但不记得在哪里...

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

【问题讨论】:

  • 使用函数而不是自执行函数?并要求用户拨打var MODULE = lib();

标签: javascript dynamic namespaces


【解决方案1】:

我想你可以添加一个方法让你设置它,然后取消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

【讨论】:

  • 然后你传入一个字符串。嗯。
  • @Raynos:是的,我刚刚更新了它以返回模块。可能会好一点。
【解决方案2】:

现在遇到这个很有趣,我只是以这种方式建立了一个新的代码库。这就是我处理它的方式(但是它取决于 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();
});

【讨论】:

    【解决方案3】:

    我知道这距离最初的问题还有很长的路要走。而且我不确定拥有一个动态命名的javascript对象的相关性。但是以下模式通过允许您在 html 页面的脚本元素中设置对象命名空间名称来做到这一点是一种合理的方式。

    类似

    <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('脚本') [document.getElementsByTagName('script').length-1] .attributes['namespaceName'].value] 用于从脚本加载中拉取属性 namespaceName

    【讨论】:

      猜你喜欢
      • 2014-02-12
      • 2018-12-31
      • 2013-05-07
      • 1970-01-01
      • 2015-11-21
      • 2019-03-22
      • 2021-05-31
      • 2014-01-26
      • 2013-06-23
      相关资源
      最近更新 更多