我的JavaScript设计模式

来源:互联网 发布:linux中oracle启动监听 编辑:程序博客网 时间:2024/04/30 05:10

前言

JavaScript的设计模式有很多,比较常用的是单例模式、模块模式和观察者模式。这里不一一介绍这些模式的用法和场景。记住,设计模式没有好坏,只有适合不适合。下面简单介绍一下我研究出来的一种JavaScript编码模式,这个模式牛逼谈不上,但是用来管理你的前端项目还是挺方便,感兴趣的同学往下看。

针对单页应用

单页应用实现的原理是通过JavaScript控制页面的显示和隐藏,好看点的话再加点转场效果。
这里我还是以单例模式为入口,因为单例模式的性能还是挺不错的,而且容易看懂。

    var index={        /*下面定义单例模式下需要‘全局’调用的变量*/        APIURL: 'http://.....com',        sStorage:window.sessionStorage,        lStorage:window.localStrorage,        pageCode: 0,        pageStack: [],        /**         * [页面容器]         * @type {Object}         */        pageContainer: {            home: {                selector: '#page-index',                sub: false,                code: 0            },            activity:{                selector:'#page-activity',                sub:false,                code:18            }        }    };    /*下面开始定义整个应用里独立的模块,注意一下:单页应用通常是以页面分模块,通用的功能写在util模块里*/    /**        * [工具模块]        * @param {[type]} $    [jQuery对象(加快jQuery选择器速度)]        * @param {[type]} self [单例上下文]    */    index.Module_util=function($,self){        /*封装模块下的私有变量*/        var _wraper=$('.ui-page');        /*封装私有的方法*/        function doSomething(){            //.....        }        /*可供外部调用的公共方法*/        return{            /**                * [过滤空对象]                * @param  {[type]} obj [要过滤的对象]                * @return {[type]}     [对象自身或空字符串]            */            filterNull: function(obj) {                if (obj) {                    if(obj=="undefined"){                        return '';                    }else{                        return obj;                     }                } else {                    return '';                }            }            //.......        };    };    /**        * [首页模块]        * @param {[type]} $    [jQuery对象]        * @param {[type]} self [单例上下文]    */    index.Module_home=function($,self){        var _trigger=$('.icon_home');        return{            /*初始化模块*/            init:function(){                //......            }        }    };    /**        * [页面事件入口]        * @return {[type]} [description]    */    index.eventPage=function($,self) {        /*先把模块实例化*/        var util=new self.Module_util($,self),            home=new self.Module_home($,self);        /*为了方便区分页面,下面用闭包封装*/        var page_home=(function(){            home.init();        })()    };    /**        * [页面返回跳转]        * @return {[type]} [description]    */    index.pageRuturn=function() {        var self = this;        $('#art-content').quickOn('click', '.icon-back', function() {            var _self = $(this);            /*根据页面状态码进行相应返回跳转*/            switch (self.pageCode) {                case 0:                    //.....                    break;                case 1:                    //......                    break;                default:                    break;            }        });    };    /**        * [首屏模板数据渲染,如果你用模板引擎的话]        * @return {[type]} [description]    */    index.fGetData=function() {        var self = this, //缓存this,上下文指向单例IndxModule            util=new self.Module_util($,self);        $.ajax({            type: "get",            async: false, //注意,因为是首屏渲染,这里必须同步请求            url: self.APIURL + '/index/index.json',            data: {},            success: function(res) {                if(res){                    var data=res.data;                    //这里我用了artTemplate                    var art = template('art-main', data);                    $('#art-content').html(art);                }            }        });    };    /**        * [单例初始化入口]        * @return {[type]} [description]    */    index.init=(function(){        /*缓存单例的上下对象和jQuery对象*/        var self=this,            $=jQuery;        /*调用单例需要执行的模块*/        self.fGetData();        self.eventPage($,self);        self.pageRuturn();    })();

针对单个页面

和上面差不多,删除pageRuturn,而且模块不是按照页面来分而是按照页面结构,分得更细一点而已,同样的,通用的功能写在util模块里面。当然这也不是千篇一律,你可以根据实际情况添加或删除些模块。
希望对你有点帮助 ^_^。

缺点

很明显,这样的编码模式虽然层次感和维护性好,但是代码容易出现冗余,尤其是针对单页应用会让代码变得很长(惭愧啊,我上次的webApp项目,单例模式里的代码已经快到5000行了)。嘿嘿,不过这也是慢慢提升的过程,接下去我要好好研究下 require.js和sea.js,把模块异步加载的功能加进去,创造一个牛逼的JavaScript编码模式 ^_^ 。

众人拾柴火焰高,感兴趣的同学快来加入这个创造过程吧!
@我微信 Jafeney

1 0
原创粉丝点击