2011-02-13 123 views
3

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

因此,而不是下面的是: -

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

    function privateMethod() { 
     // ... 
    } 

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

    return my; 
}()); 

模块可以设置为任何你喜欢的,我记得看到它做IA的截屏,但不记得在哪里...

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

+0

使用函数而不是自执行函数?并要求用户调用'var MODULE = lib();' – Raynos

回答

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 
+0

,然后传入一个字符串。 EW。 – Raynos

+0

@Raynos:是的,我刚刚更新,以便它返回模块。可能更好一点。 – user113716

0

搞怪现在碰到这个问题,我只是成立了一个新的代码库这种方式。这是我走近它(这取决于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

我知道这是原来的问题后还很远。我不确定有一个动态命名的JavaScript对象的相关性。但是,通过允许您在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] || {})); 

的 窗口[document.getElementsByTagName( '脚本') [document.getElementsByTagName( '脚本')。长度-1] .attributes [ 'namespaceName']。值] 是用来拉属性namespaceName从脚本加载的值