0

このURLからjavascript Modular patternを読んでいてhttp://viralpatel.net/blogs/javascript-module-pattern/

http://www.codeproject.com/Articles/247241/Javascript-Module-Pattern

そして、私の心に混乱が生じることがあります。だからここで私は混乱するところに物を置いています。すべてを理解するのを手伝ってください。

質問1

以下のコードを参照してください。var キーワードを使用してモジュールで宣言されたすべてのプライベート変数と関数。ここで pub オブジェクトも var キーワードで宣言されています。パブがプライベートであることを意味します。したがって、pub が非公開の場合、以下のコードのように外部から pub 関連の関数を呼び出す方法

呼び出し構文

CalcModule.add(2,10);
CalcModule.add(5,15);

CalcModule = (function(){
        var pub = {};
        var mem = new Array(); //private variable

        var storeInMemory = function(val) {  //private function
                            mem.push(val);
                    };

        pub.add = function(a, b) { 
                     var result = a + b;
                     storeInMemory(result); //call to private function
                     return result;
                  };

         pub.sub = function(a, b) {
                     var result = a - b;
                     storeInMemory(result); //call to private function
                     return result;
                  };

         pub.retrieveFromMemory = function() {
                     return mem.pop();
                 };

               return pub;
})();

CalcModule.add(2,10);
CalcModule.add(5,15);
console.log(CalcModule.retrieveFromMemory()); //outputs 20
console.log(CalcModule.retrieveFromMemory()); //outputs 12

質問2

異なる JS ファイル間でのモジュールの分離: 拡張

file1.js

var CalcModule = (function($, pub){
                        //jQuery will still be available via $
                        var mem = new Array(); //private variable

                        pub.storeInMemory = function(val){
                                                mem.push(val);
                                            };

                        pub.retrieveFromMemory = function(){
                                     return mem.pop();
                       };

                       return pub;
})(jQuery, CalcModule || {});

file2.js

var CalcModule = (function($, pub){
                       //jQuery will still be available via $
                       pub.add = function(a,b){ 
                                     var result = a + b;
                                     pub.storeInMemory(result);
                                     return result;
                                  };

                       pub.sub = function(a,b){
                                     var result = a - b;
                                     pub.storeInMemory(result);
                                     return result;
                                  };

                       return pub;
}(jQuery, CalcModule || {}));

このfunction($, pub)構文を参照してください。なぜドル記号があり、なぜpubがそこを通過する必要があるのか​​.

質問 3

module Augmentation と sub module はどう違いますか?

質問 4

既存のモジュール モジュールの拡張

var Module1 = ( function (oldModule) {
    var 
    //assigning oldmodule in to a local variable.
    parent = oldModule;

    //overriding the existing privileged method.
    parent.privilegedMethod = function ( ){
         //do something different by overriding the old method.
    };

    //private method accessing privileged method of parent module.
    var privateMethod2 = function ( ) {
        parent.privilegedMethod();//can access privileged method of Module
        parent.publicMethod1(); //can access public method of Module
    }
    return {
        newMethod : function ( ) {
          ///do something for this brand new module.
          ///use some functionality of parent module.
          /// parent.privilegedMethod( );
        }
    };
} )(Module);//

モジュールオブジェクトは、拡張したい既存のモジュールです。

モジュールを拡張する上記のコードを誰でも理解できる方法。この構文だけで(Module)

質問5

モジュールを 5 つの個別の js ファイルに記述する場合、どのファイルを最初にロードする必要がありますか。これらのモジュール関連の s ファイルをロードする順序はどうなりますか?

4

1 に答える 1

0

答え 1

最後に戻ってくるpubので、そのすべてのメソッドにアクセスできます

CalcModule = (function(){ return pub; }());
CalcModules === pub

答え 2

function($, pub)

これは、コードの最後に呼び出される無名関数の宣言です

ここに、jQuery とモジュールを渡す効果的な呼び出しがあります。

(jQuery, CalcModule || {}));

注意

jQuery を最初のパラメーターとして渡し、CalcModule が存在する場合のみ 2 番目のパラメーターとして渡します。それ以外の場合は空のオブジェクト (CalcModule OR {}) です。関数が最初に呼び出されたときは CalcModule が存在しないため、空のオブジェクトを渡すことになります。これは、順序に依存しないようにするために行われます。

だから私たちは推測することができます

最初の呼び出し

$ === jQuery
pub === {}

2 回目以降の呼び出し

$ === jQuery
pub === CalcModule

展開できるように、関数に CalcModule を渡す必要があります。

これ

(function($, pub){...}(jQuery, CalcModule || {}));

これとまったく等しい

var anonFunc = function($, pub){...};
anonfunc(jQuery, CalcModule || {});

答え 3

拡張: 同じモジュールに機能を追加しています

pub.add = function(a,b){}
pub.sub = function(a,b){}

サブモジュール: モジュールを別のモジュールに追加しています

subModule.add = function(a,b){}
subModule.sub = function(a,b){}
pub.subModule = function(a,b){ return mySubModule; }

答え 4

あなたは合格Moduleしていますが、合格したものを使用できる真新しいモジュールを作成していModuleます。これは、拡張というよりも一種の継承に似ています

答え 5

場合によりますが、モジュールの機能を宣言しているだけなので、一般的には問題ありません。順序を尊重する必要がある唯一のケースは、機能の構築がモジュールの別の機能に依存する場合です。

于 2015-05-12T12:24:48.433 に答える