通过上面的代码,我们对模块化有了一定的了解,下面从面向对象思想出发,对模块进行分析.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| * 这是定义模块add */ var addModule = (function () { return function () { console.log("i'm add module ...."); } })(); * 这是定义模块minus */ var minusModule = (function () { return function () { console.log("I'm minu module...."); } })(); * 这是计算模块,依赖模块add 和模块minus * @type {[type]} */ var calcModule = (function (add,minus) { return { add: add, minus: minus } })(addModule,minusModule);
|
我们通过上面的代码可以分析抽象建立我们的Module
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| Module = { id:"",//模块唯一标识 deps: [],//模块依赖数组 factory: function, //回调函数 returnVal: {} //模块暴露返回值 } /** * 模块缓存对象 * @type {Object} */ moduleMap: { "scripts/main": {//-->Module id:"scripts/main", deps: ['./calc'], factory: function, returnVal: {} //返回值 } }
|
代码修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| * 创建增加计算模块 * @type {Module} */ var addModule = new Module('add',[],function () { return function () { console.log("i'm new add module ...."); } }); moduleMap['add'] = addModule; * 创建减少计算模块 * @type {Module} */ var addModule = new Module('minus',[],function () { return function () { console.log("I'm new minu module...."); } }); moduleMap['minus'] = addModule; var calcModule = new Module("calc",['add','minus'],function (add,minus) { return { add: add, minus: minus } }); moduleMap['calc'] = calcModule;
|
需要为我们的Module对象添加两个方法: fireFactory(执行factory函数,赋值给returnVal)和getDepsValues(获取依赖模块的返回值)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| Module.prototype.fireFactory = function () { var mod = this; var args = mod.getDepsValues(); var ret = mod.factory.apply(null, args); mod.returnVal = ret; return mod.returnVal; } Module.prototype.getDepsValues = function () { var mod = this; var args = []; var deps = mod.deps; var dep; var argsLen = deps.length; for (var i = 0; i < argsLen; i++) { dep = getMod(deps[i]); args.push(dep.exec()); } return args; }
|