JavaScript模块模式

module pattern

目前了解到的有三种模块模式的书写方式,可根据需要选择最合适的。

第一种:原始方式书写的模块

function m1 () {}
function m2 () {}
function m3 () {}
//...

第二种:创建对象的方式书写的模块

var module = {
    count: 1,
    addNum: function() {
        this.count++;
    },
    minusNum: function() {
        this.count--;
    }
};
module.addNum();
module.minusNum();
module.count = 1;   //会被篡改

第三种:设置带私有变量的模块模式

知识储备:

1. 自执行函数 闭包closure

(function() {
    //code
})();

//or
(function(){
    //code
}());
//两种匿名函数自执行方式的效果一样
//纠正一个观念:闭包不会引起内存泄漏,内存泄漏是程序员使用闭包的方式不当导致的。

贺师俊在知乎上的回答:

闭包不会造成内存泄漏。程序写错了才会造成内存泄漏。另外,那些书讲的事情应该是:老浏览器(主要是IE6)由于垃圾回收有问题导致很容易出现内存泄漏。但是那是浏览器实现的bug。如果书里面没把这个意思写清楚,那就是本烂书,不要看了,赶紧扔掉。

2. Module

var module = (function() {
    return {}
})();

3. private var & method


//外部访问不到_self与addNum
var module = (function() {
    var _self;
    var addNum = function() {};
    return {}
})();

4. return 暴露给用户的方法/属性

//可供外部访问的变量通过return暴露出来
var module = (function() {
    var _self;
    var addNum = function() {};
    return {
        _self: _self,
        addNum: addNum
    }
})();

module._self;
module.addNum();

总结:

所以使用模块模式可以采用以下的编码形式:

var module = (function() {
    var _private;
    var public;
    var _privateMethod = function() {};
    var someMethod = function() {};
    var anotherMethod = function() {};
    return {
        public: public,
        someMthod: someMethod,
        anotherMethod: anotherMethod
    }
})();

然后提供一个接口用于扩展的方法:

var module = (function() {
    var _private;
    var public;
    var _privateMethod = function() {};
    var someMethod = function() {};
    var anotherMethod = function() {};
    return {
        public: public,
        someMthod: someMethod,
        anotherMethod: anotherMethod
        
        //看这里
        extension: function() {}
    }
})();
var moduleTwo = (function(module) {
    module.extension = function() {
        //anotherMethod
    };
    return module;
})(module || {});

私有变量一般使用_+变量名的命名形式。

posted @ 2017-01-21 16:45  君寻不惑  阅读(248)  评论(0编辑  收藏  举报