2011-02-13 18 views
3

モジュールパターンを作成できるが、モジュールが動的に存在する名前空間を設定できるというパターンは誰にも分かりません。だからではなく、以下であるものの動的名前空間モジュールのパターン

: -

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

    function privateMethod() { 
     // ... 
    } 

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

    return my; 
}()); 

MODULEはあなたが好きなものに設定することができ、私はそれがIAスクリーンキャストを行わなく、どこ思い出すことができない見て覚えている...

基本的に私は、実装者が好む任意の名前空間に割り当てることができるライブラリを作成したい。

+0

機能を使用するのではなく、自己実行機能を使用しますか?ユーザーが 'var MODULE = lib();' – Raynos

答えて

0

私はあなたがそれを設定できる方法を追加できると思って、MODULEを無効にします。その後、

my.namespace = function(ns) { 
    window[ns] = my; 
    window.MODULE = null; 
} 

http://jsfiddle.net/yrsdR/

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要素にオブジェクトの名前空間名を設定できるようにすることで、合理的な方法です。あなたは、あなたのJavaScriptでmyObject.hello()を呼び出すことができます

<script src="js/myscript.js" namespaceName="myObject"><script> 

よう

何か。

例このソリューションを使用する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] [ 'namespaceName']値 .attributes] を引っ張るために使用されています属性名前空間名スクリプトの値からの値

関連する問題