JavaScript的Module模式

模块模式是单例模式的一种变体,它是Douglas Crockford创建的。该模式包含三个主要的组件:命名空间,立即执行的函数和函数的返回的对象。该返回对象中包含了共有方法和共有属性。代码如下:

//名称空间是myApp,传入jQuery对象以缩短查找过程
var myApp = function($) {
    //私有变量和方法,仅在该myApp中可用
    var message ="not directly accessible from outside the module";
    function multiplier(x, y) {
        return x*y;
    };
    
    //返回的对象包含了公有属性和公有方法
    return {
        init : function() {
            //初始化app
        },
        prop : "42", //公有属性
        specialNumber : function() {
            //访问私有方法
            var num = multiplier(7, 6);
            return "Our special number is definitely " + num;        
        },
        shareMessage : function(arg) {
            if (arg === "open sesame") {
                return message + ", unless you know the magic world.";
            else {
                throw new Error("You need to know the magic word.");
            }
        },
    };
} (jQuery);

Garber-Irish实现思路:

利用一个简短的工具脚本和<body>元素上的ID和CSS类、或者<body>元素上的HTML5的data属性,提供了一种根据网站的区块或页面类型,有选择性地触发init()事件的方法。

(1)最初的方案

myApp = {
    common : {
        init : function() {
            //当需要相关小节或特性时,在$(document).ready()方法中调用
        },
        finalize : function() {
            //写入需要尽快执行,但又不会影响到起始页面加载的代码
        }
    },
    dashboard : {
        init : function() {
            //dashboard初始化
        },
        settings : function() {
            //dashboard设置
        },
        render : function() {
            //呈现
        },
    },
};

工具代码:

Util = {

    fire : function(func, funcname, args) {
        var namespace = myApp; //指定对象字面量的名称空间
        funcname = (funcname === undefined) ? 'init' :funcname;
        if (func !== '' && namespace[func] && typeof namespace[func][funcname] == 'function') {
            namespace[func][funcname](args);
        }
    },

    loadEvents : function() {
        var bodyId = document.body.id;
        //首先调用common
        Util.fire('common'); //第二个参数默认为init
        
        //对所有其它类执行调用
        $.each(document.body.className.split(/\s+), function(i, classnm) {
            Util.fire(classnm);
            Util.fire(classnm, bodyId);
        });
        
        Util.fire('common', 'finalize');
    }
};

//在这里触发所有执行
$(document).ready(Util.loadEvents);

(2)使用HTML5 data属性的方案

唯一区别在于,使用了HTML5的data属性来触发事件的执行。

<body data-controller="dashboard" data-action="render">

摘自:jQuery高级编程 清华大学出版社.pdf 

           第 10 章 编写高效的jQuery代码 

           10.2.2 Module模式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值