我的JavaScript设计模式

39 篇文章 0 订阅
10 篇文章 0 订阅

前言

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值