在javascript中,单例(singleton)就是指只有一个实例的对象,而不需要用new关键字去创建一个对象示例。单例其实有点类似于C# /C++里面的静态类。在javascript中,是以对象字面量的方式来创建单例对象的,也就是以花括号包裹起来的键值对的JSON形式来创建的。例如:
var singletonObj={
name:'John',
method:function(){
//方法代码
}
};
name:'John',
method:function(){
//方法代码
}
};
模块模式则是用来为单例创建私有变量和特权方法(公有方法),从而能增强单例的可访问性。以模块模式定义的私有变量和私有函数只有单例对象本身的特权(公有)方法可以访问到,其他外部的任何对象都不可以。其语法形式如下:
var singleton = function(){
//私有变量
var privateVariable = 10;
//私有函数
function privateFunction(){
return false;
}
//返回对象
return {
//公有属性
publicProperty: true,
//公有属性和公有方法
publicMethod : function(){
privateVariable++;
return privateFunction();
}
};
}();
//私有变量
var privateVariable = 10;
//私有函数
function privateFunction(){
return false;
}
//返回对象
return {
//公有属性
publicProperty: true,
//公有属性和公有方法
publicMethod : function(){
privateVariable++;
return privateFunction();
}
};
}();
上面的代码中,我们创建了一个匿名函数并赋值给变量singleton,然后立即调用这个函数返回可以公开的公有方法和属性的对象实例。在匿名函数内部,首先定义了私有变量和私有函数,然后将一个对象实例作为函数值返回,这样返回的对象中只包含可以公开的属性和方法。因为这个返回的对象在匿名函数内部定义,因此它内部的公有方法和属性都可以访问私有变量和函数。这种模式适合需要对单例进行一些初始化,又需要维护私有变量时。
单例对象中公有属性和公有方法的调用与一般对象的属性和方法调用一样,使用点表示法或者方括号语法来调用单例对象的公有成员。例如:
alert(singleton.publicProperty);
alert(singleton[publicProperty]);
执行结果都是:true