模块化:将复杂的系统分解成高内聚、低耦合的模块,使系统开发变得可控、可维护、可扩展,提高模块的复用率
//模块管理器单体对象
//定义模块管理器单体对象
var F = F || {};
/***
*@param str 模块路由
*@param fn 模块方法
**/
F.define = function(str , fn){
//解析路由
var parts = str.split(".");
//当前模块的祖父模块,parent当前模块父模块
old = parent = this;
//i 模块层级,len 模块层级长度
i = len = 0;
if(parts.length > 0){
//如果第一个模块是模块管理器单体对象,则移除
if(parts[0] === "F"){
parts = parts.slice(1);
}
//屏蔽对define与module模块方法的重写
if(parts[0] === "define" || parts[0] === "module"){
return ;
}
//遍历路由模块并定义每层模块
for(var i = 0 ; i < parts.length ; i++){
if(typeof parent[parts[i]] === "undefined"){
parent[parts[i]] = {};
}
old = parent;
parent = parent[parts[i]];
}
//如果给定模块方法则定义该模块方法
if(fn){
old[parts[--i]] = fn();
}
return this;
}
};
F.define("say.hello",function(){
return function(str){
console.log(str);
}
});
//模块调用方法
F.module = function(){
//将参数转化为数组
var args = [].slice.call(arguments);
//获取执行函数
fn = args.pop();
//获取模块依赖,如果args[0] 是数组,则依赖模块为args[0],否则依赖模块为args
parts = args[0] && args[0] instanceof Array ? args[0]:args;
//依赖模块列表
modules = [];
//模块路由
modIDs = '';
i = 0 ;
//依赖模块长度
ilen = parts.length;
while(i < ilen){
//解析模块路由,并屏蔽模块父对象
modIDs = parts[i].replace(/^F\./,'').split(".");
parent = this;
for(var j = 0 ; j < modIDs.length ; j++){
parent = parent[modIDs[j]] || false;
}
//将模块添加到依赖模块列表中
modules.push(parent);
i++;
}
//构造函数执行环境
fn.apply(null,modules);
}
F.module(['say.hello'],function(say){
say("say Hello");
});