JavaScript设计模式详解:揭示模块与单例模式
作者:代码拾荒时间:2026-10-25 19:08:34浏览:184
本文深入解析JavaScript中的揭示模块模式与单例模式。揭示模块通过返回对象暴露私有方法,提升代码可读性;单例模式确保类仅有一个实例并提供全局访问点。文章结合代码示例,阐述两种模式的实现细节、优缺点及适用场景,帮助开发者优化JS架构。
1. 揭示模块模式(Revealing Module)
该模式允许在私有作用域内定义所有函数和变量,最终返回一个匿名对象。该对象包含指向私有函数的引用,这些引用代表了希望对外公开的接口方法。
具体实现示例如下:
<script>
var myRevealingModule = function () {
var privateVar = "Ren Cherry",
publicVar = "Hey there";
function privateFunction() {
console.log("Name:"+privateVar);
}
function publicSetName(strName) {
privateName = strName;
}
function publicGetName() {
privateFunction();
}
//将暴露的公有指针指向到私有函数和属性上
return {
setName: publicSetName,
greeting: publicvar,
getName: publicGetName
};
}();
myRevealingModule.setName("Paul Kinlan");
</script>
主要优势:
- 此模式使得哪些函数和变量可供外部访问变得一目了然,从而显著提升了代码的可读性。
- 需要注意的是,如果某个私有函数内部引用了另一个公有函数,在进行代码修补时,该公有函数将无法被覆盖。这是因为私有函数依然指向原始的私有实现。因此,该模式主要适用于函数封装,并不完全适用于所有类型的公有成员暴露。
2. 单例模式(Singleton)
单例模式的核心在于限制类的实例化次数,确保整个系统中该类仅能存在一个实例。当所需实例尚不存在时,通过特定方法创建新实例;若实例已存在,则直接返回该现有对象的引用。
代码实现示例:
<script type="text/javascript">
var mySingleton = (function () {
//实例保持了singleton 的一个引用
var instance;
function init() {
//singleton
//私有方法和变量
function privateMethod() {
console.log("I am private");
}
var privateVariable = "I am also private";
var privateRandomNumber = Math.random();
return {
//公有方法和变量
publicMethod: function () {
console.log("The public can see me!");
},
publicProperty: "I am also public",
getRandomNumber: function() {
return privateRandomNumber;
}
};
};
return {
//获取singleton 的实例,如果存在就返回,不存在就创建新实例
getInstance: function() {
if(!instance) {
instance = init();
}
return instance;
}
};
})();
var singleA = mySingleton.getInstance();
var singleB = mySingleton.getInstance();
console.log(singleA.getRandomNumber()===singleB.getRandomNumber());//true
</script>
在实际开发中,当系统需要一个对象来协调其他多个对象的交互时,单例模式具有极高的应用价值。
另一种单例模式的实现示例:
<script type="text/javascript">
var SingletonTester = (function() {
//options: 包含singleton所需配置信息的对象
//var options = {name:"test",pointX:5};
function Singleton(options) {
//如果未提供options,则设置为空对象
options = options || {};
//为singleton设置一些属性
this.name = "SingletonTester";
this.pointX = options.pointX || 6;
this.pointY = options.pointY || 10;
}
//实例持有者
var instance;
//静态变量和方法的模拟
var _static = {
name: "SingletonTester",
//获取实例的方法,返回singleton对象的singleton实例
getInstance: function(options) {
if(instance === undefined) {
instance = new Singleton(options);
}
return instance;
};
return _static;
}
})();
var singletonTest = SingletonTester.getInstance({
pointX: 5
});
console.log(singletonTest.pointX);//5
</script>以上是对JavaScript设计中揭示模块模式与单例模式的详细解析,更多JS相关设计模式资料请持续关注本站内容。
作者最新文章
JavaScript入门书籍避坑:这些书不适合初学者
2026-11-05 16:31:15
JS使用Math.round实现保留两位小数的原理与代码
2026-11-05 15:35:55
JavaScript 原生 Date 对象怎么实现日期加减
2026-11-05 14:30:00
JavaScript函数定义的三种方式:声明、表达式与箭头函数
2026-11-05 13:50:55
JavaScript中escape、encodeURI和encodeURIComponent对空格的处理差异
2026-11-05 12:47:23
