2011-02-13 172 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從腳本加載的值