0

我正在从这个 url 阅读 javascript Modular patternhttp://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 文件分离模块:增强

文件1.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 || {});

文件2.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

模块增强和子模块有什么区别?

问题 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 文件中编写模块,那么我们需要首先加载哪个文件。加载那些与模块相关的文件的顺序是什么?

4

1 回答 1

0

答案 1

因为最后它会返回pub所以你可以访问它的所有方法

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

答案 2

function($, pub)

这是在代码末尾调用的匿名函数的声明

在这里,我们有有效的调用传递 jQuery 和你的模块

(jQuery, CalcModule || {}));

注意

我们将 jQuery 作为第一个参数传递,并将 CalcModule 作为第二个参数传递,除非存在其他空对象(CalcModule OR {})。第一次调用该函数时 CalcModule 不存在,因此您最终会传递一个空对象,第二次 CalcModule 存在是因为已由上一次调用创建。这样做是为了使其订单不可知。

所以我们可以推断

第一次通话

$ === jQuery
pub === {}

第二次和下一次通话

$ === 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 回答