JavaScript 单例模式详解与实例

作者:闭包旅人时间:2026-10-27 18:01:57浏览:447

本文深入解析 JavaScript 中的单例模式,阐述其确保类仅有一个实例并提供全局访问点的核心机制。通过对象字面量、闭包封装及带配置参数的三种典型代码实例,展示如何在实际开发中隔离全局命名空间并协调系统交互,帮助开发者掌握这一基础且重要的设计模式。

单例模式核心概念

什么是单例?

单例模式的核心要求是确保一个类在整个系统中仅存在唯一的一个实例,并提供一个全局访问点来访问该实例。为了实现这一目标,它需要绕过常规的实例化控制流程,由设计者负责保证实例的唯一性,而使用者只需通过全局访问点获取实例,无需关心底层具体存在几个实例。

代码如下:

In JavaScript, Singletons serve as a shared resource namespace which isolate implementation code from the global namespace so as to provide a single point of access for functions.

在 JavaScript 中,单例通常被用作一个全局命名空间,旨在将实现代码与全局命名空间隔离开来,从而为函数提供一个统一的访问入口。

单例模式使用场景与类比

使用场景

代码如下:

In practice, the Singleton pattern is useful when exactly one object is needed to coordinate others across a system.

在实际应用中,当系统中需要且仅需要一个对象来协调其他多个组件或系统进行交互时,单例模式尤为适用。

类比

单例的概念类似于团队中的组长:在特定时间段内,一个团队只有一位组长,由该组长负责指定、分配和协调组员的工作任务。

JavaScript 单例模式代码实例

实例1:这是最简单的单例实现方式,通过键值对(key-value)的形式直接存储属性和方法。

代码如下:

var A = {
xx:3,
yy:4,
B:function(el){
   },
C:function(el){
   },
D:function(el){
   },
E:function(el){
   }
}

实例2:首先创建一个实例的引用,然后判断该实例是否已存在。如果不存在则创建新实例;如果已存在,则直接返回现有实例,从而保证系统中始终有且只有一个实例。

代码如下:

var mySingleton = (function () {
// Instance 存储一个单例实例的引用
var instance;
function init() {
// Singleton
// 私有的方法和变量
function privateMethod(){
 console.log( "I am private" );
}
var privateVariable = "Im also private";
return {
// 共有的方法和变量
 publicMethod: function () {
 console.log( "The public can see me!" );
 },
publicProperty: "I am also public"
};
};
return {
// 如果实例不存在,那么创建一个
getInstance: function () {
if ( !instance ) {
 instance = init();
 }
return instance;
}
};
})();
var singleA = mySingleton;
var singleB = mySingleton;
console.log( singleA === singleB ); // true

实例3:

代码如下:

var SingletonTester = (function () {
// options: an object containing configuration options for the singleton
// e.g var options = { name: "test", pointX: 5};
function Singleton( options ) {
// set options to the options supplied
// or an empty object if none are provided
options = options || {};
// set some properties for our singleton
this.name = "SingletonTester";
this.pointX = options.pointX || 6;
this.pointY = options.pointY || ;
  }
// our instance holder
var instance;
// an emulation of static variables and methods
var _static = {
name: "SingletonTester",
// Method for getting an instance. It returns
// a singleton instance of a singleton object
getInstance: function( options ) {
if( instance === undefined ) {
instance = new Singleton( options );
      }   
return instance;
    } 
  }; 
return _static;
})();
var singletonTest = SingletonTester.getInstance({
pointX: 5
});
// Log the output of pointX just to verify it is correct
// Outputs: 5
console.log( singletonTest.pointX );
作者最新文章