定义:单体模式,也叫单例模式,主要作用是用来划分命名空间,将一批相关的方
法和属性组织在一起,且只能被实例化一次
实现方式一:对象字面量
在下面的对象projects中,存在属于其自己的属性和方法。但这些都是公有的,如
果其中有this的指代,则可能随着执行环境的上下文的不同而改变存在风险。
加载(实例化)全部projects,非惰性加载。
var projects = {
project_01_name : 'shopping',
method_01 : function () {
console.log('hello')
}
};
console.log(projects.project_01_name);
projects.method_01();
实现方式二:利用下划线的方式定义私有属性及方法(扩展)
依然是创建对象的方式,仅仅以是否是下划线来区分私有和公有方法,
额,并不具有很大的区别与第一个,虽然下划线定义私有成员是一个公认的规则
var muXiProject = {};/*全局对象,工程性,一级库*/
muXiProject.shopping = {//注意!这是对象的形式
_name :'muxi_shop', //private property
_buy :function(obj) { //private method
var money = obj.money;
console.log(_name+' get ¥'+money)
},
buy: function (obj) { //public method buy()
return _buy(obj);
}
};
muXiProject.shopping.buy({
money:12
});
实现方式三:利用闭包方式实现私有成员(扩展)
定义私有的属性及方法,最后返回公有的接口(buy),之后的维护和修改
,不用管接口,只用修改内部私有方法即可,不影响外部调用
var muXiProject = {};/*全局对象,工程性,一级库*/
muXiProject.shopping = (function () {//注意!这是一个自执行函数,返回暴露的方法
var privateName = 'muxi_shop';
function privateMethod(obj) {
var money = obj.money;
console.log(privateName+' get ¥'+money);
};
return { //public method
buy: function (obj) {
return privateMethod(obj);
}
}
})();
muXiProject.shopping.buy({
money:11
});
闭包方式的另外一种实现:工程中可以这样进行工具建设,并对外暴露方法,调用同上
;(function () {
var privateName = 'muxi_shop';
function privateMethod(obj) {
var money = obj.money;
console.log(privateName+' get ¥'+money);
};
/*对外暴露buy方法*/
muXiProject.shopping = {
buy: function (obj) {
return privateMethod(obj);
}
}
})()
实现方式四:闭包实现单体的惰性实例化(升级)
惰性加载:前面的单体对象都是在脚本加载是后被创建出来,而如果遇到资源密集或
者开销大的单体的时候,加载可以加一个开关推迟其实例化时间,到用的时候。
技巧:它最常用于
那些必须加载大量数据的单体。而那些被作用的命名空间、特定网页专用代码包装器或
组织相关实用方法的工具的单体最好还是立即实例化。
转化过程:利用constructor方法将所有原先的单体方法转移进去,之后利用新
的调用方式调用;
调用方式:muXiProject.shopping.getIntance().public_method();访问需借助静态方法
muXiProject.shopping = (function () {
var instance;
function constructor() { //这里定义单体的代码
var privateName = 'muxi_shop';
function privateMethod(obj) {
var money = obj.money;
console.log(privateName+' get ¥'+money);
};
return {
public_buy: function (obj) {
return privateMethod(obj);
}
}
};
//返回静态方法,进行实例化判定
return{
getIntance :function () {
if (!instance){
instance = constructor();/*实例化*/
}
return instance;
}
}
})()
muXiProject.shopping.getIntance().public_buy({money:9})
有空还是多读读英文的资料:
https://github.com/shichuan/javascript-patterns/blob/master/design-patterns/singleton.html
http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/#singletonpatternjavascript