美文网首页
javascript设计模式——同步模块模式

javascript设计模式——同步模块模式

作者: 蟹老板爱写代码 | 来源:发表于2018-04-08 10:02 被阅读0次

    模块化:将复杂的系统分解成高内聚、低耦合的模块,使系统开发变得可控、可维护、可扩展,提高模块的复用率

    //模块管理器单体对象
    
    //定义模块管理器单体对象
        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");
        });
    

    相关文章

      网友评论

          本文标题:javascript设计模式——同步模块模式

          本文链接:https://www.haomeiwen.com/subject/odkphftx.html