龙盟编程博客 | 无障碍搜索 | 云盘搜索神器
快速搜索
主页 > web编程 > Javascript编程 >

大型JavaScript应用程序架构模式(1)(3)

时间:2013-03-06 14:58来源:未知 作者:admin 点击:
分享到:
对象自面量 对象自面量使用大括号声明,并且使用的时候不需要使用new关键字,如果对一个模块里的属性字段的publice/private不是很在意的话,可以使用这

对象自面量

对象自面量使用大括号声明,并且使用的时候不需要使用new关键字,如果对一个模块里的属性字段的publice/private不是很在意的话,可以使用这种方式,不过请注意这种方式和JSON的不同。对象自面量:var item={name: "tom", value:123} JSON:var item={"name":"tom", "value":123}。

  1. var myModule = {  
  2.     myProperty: 'someValue',  
  3.     //object literals can contain properties and methods.  
  4.     //here, another object is defined for configuration  
  5.     //purposes:  
  6.     myConfig: {  
  7.         useCaching: true,  
  8.         language: 'en' 
  9.     },  
  10.     //a very basic method  
  11.     myMethod: function () {  
  12.         console.log('I can haz functionality?');  
  13.     },  
  14.     //output a value based on current configuration  
  15.     myMethod2: function () {  
  16.         console.log('Caching is:' + (this.myConfig.useCaching) ? 'enabled' : 'disabled');  
  17.     },  
  18.     //override the current configuration  
  19.     myMethod3: function (newConfig) {  
  20.         if (typeof newConfig == 'object') {  
  21.             this.myConfig = newConfig;  
  22.             console.log(this.myConfig.language);  
  23.         }  
  24.     }  
  25. };  
  26.  
  27. myModule.myMethod(); //I can haz functionality  
  28. myModule.myMethod2(); //outputs enabled  
  29. myModule.myMethod3({ language: 'fr', useCaching: false }); //fr 

CommonJS

关于 CommonJS的介绍,这里就不多说了,博客园有很多帖子都有介绍,我们这里要提一下的是CommonJS标准里里有2个重要的参数exports和require,exports是代表要加载的模块,require是代表这些加载的模块需要依赖其它的模块,也需要将它加载进来。

  1. /*  
  2.    Example of achieving compatibility with AMD and standard CommonJS by putting boilerplate around the standard CommonJS module format:  
  3.    */ 
  4.       
  5.    (function(define){  
  6.    define(function(require,exports){  
  7.    // module contents  
  8.    var dep1 = require("dep1");  
  9.    exports.someExportedFunction = function(){...};  
  10.    //...  
  11.    });  
  12.    })(typeof define=="function"?define:function(factory){factory(require,exports)}); 

有很多CommonJS标准的模块加载实现,我比较喜欢的是RequireJS,它能否非常好的加载模块以及相关的依赖模块,来一个简单的例子,例如需要将图片转化成ASCII码,我们先加载encoder模块,然后获取他的encodeToASCII方法,理论上代码应该是如下:

  1. var encodeToASCII = require("encoder").encodeToASCII;  
  2.  exports.encodeSomeSource = function(){  
  3.  //其它操作以后,然后调用encodeToASCII  
  4.  } 

但是上述代码并没用工作,因为encodeToASCII函数并没用附加到window对象上,所以不能使用,改进以后的代码需要这样才行:

  1. define(function(require, exports, module) {  
  2.    var encodeToASCII = require("encoder").encodeToASCII;  
  3.    exports.encodeSomeSource = function(){  
  4.    //process then call encodeToASCII  
  5.    }  
  6.    }); 

CommonJS 潜力很大,但是由于大叔不太熟,所以就不过多地介绍了。

Facade模式

Facade模式在本文架构里占有重要角色,关于这个模式很多JavaScript类库或者框架里都有体现,其中最大的作用,就是包括High level的API,以此来隐藏具体的实现,这就是说,我们只暴露接口,内部的实现我们可以自己做主,也意味着内部实现的代码可以很容易的修改和更新,比如今天你是用jQuery来实现的,明天又想换YUI了,这就非常方便了。

下面这个例子了,可以看到我们提供了很多私有的方法,然后通过暴露一个简单的 API来让外界执行调用内部的方法:

  1. var module = (function () {  
  2.     var _private = {  
  3.         i: 5,  
  4.         get: function () {  
  5.             console.log('current value:' + this.i);  
  6.         },  
  7.         set: function (val) {  
  8.             this.i = val;  
  9.         },  
  10.         run: function () {  
  11.             console.log('running');  
  12.         },  
  13.         jump: function () {  
  14.             console.log('jumping');  
  15.         }  
  16.     };  
  17.     return {  
  18.         facade: function (args) {  
  19.             _private.set(args.val);  
  20.             _private.get();  
  21.             if (args.run) {  
  22.                 _private.run();  
  23.             }  
  24.         }  
  25.     }  
  26. } ());  
  27.  
  28. module.facade({run:true, val:10});  
  29. //outputs current value: 10, running 

Facade和下面我们所说的mediator的区别是,facade只提供现有存在的功能,而mediator可以增加新功能。

精彩图集

赞助商链接