当前位置:首页 > JavaScript

js实现单例模式

2026-03-01 06:49:03JavaScript

实现单例模式的方法

在JavaScript中实现单例模式可以通过多种方式完成。以下是几种常见的实现方法:

使用对象字面量

最简单的单例模式实现方式是直接使用对象字面量。这种方式适用于不需要延迟初始化的情况。

const singleton = {
  property: 'value',
  method: function() {
    console.log('Singleton method');
  }
};

使用闭包和立即执行函数表达式(IIFE)

通过闭包和IIFE可以创建私有变量,并且延迟单例的初始化。

js实现单例模式

const Singleton = (function() {
  let instance;

  function createInstance() {
    const object = new Object('I am the instance');
    return object;
  }

  return {
    getInstance: function() {
      if (!instance) {
        instance = createInstance();
      }
      return instance;
    }
  };
})();

const instance1 = Singleton.getInstance();
const instance2 = Singleton.getInstance();
console.log(instance1 === instance2); // true

使用ES6类

在ES6中,可以使用类的静态方法来实现单例模式。

class Singleton {
  constructor() {
    if (!Singleton.instance) {
      Singleton.instance = this;
    }
    return Singleton.instance;
  }

  static getInstance() {
    if (!this.instance) {
      this.instance = new Singleton();
    }
    return this.instance;
  }
}

const instance1 = new Singleton();
const instance2 = new Singleton();
console.log(instance1 === instance2); // true

使用模块模式

在现代JavaScript中,模块本身就是单例的,可以利用这一特性实现单例模式。

js实现单例模式

// singleton.js
let instance;

class SingletonClass {
  constructor() {
    if (instance) {
      throw new Error('You can only create one instance!');
    }
    instance = this;
  }
}

const singleton = Object.freeze(new SingletonClass());
export default singleton;

使用Proxy

Proxy可以用于控制对象的创建行为,确保只创建一个实例。

function Singleton(targetClass) {
  let instance;
  return new Proxy(targetClass, {
    construct(target, args) {
      if (!instance) {
        instance = new target(...args);
      }
      return instance;
    }
  });
}

class MyClass {
  constructor() {
    this.name = 'MyClass';
  }
}

const SingletonClass = Singleton(MyClass);
const instance1 = new SingletonClass();
const instance2 = new SingletonClass();
console.log(instance1 === instance2); // true

选择适合的方法

选择哪种实现方式取决于具体需求:

  • 对象字面量适用于简单的单例需求
  • IIFE方式提供了更好的封装性
  • ES6类方式更适合面向对象编程
  • 模块模式适合现代模块化开发
  • Proxy方式提供了更灵活的控制

每种方法都能确保在整个应用程序中只存在一个实例,开发者可以根据项目需求和编码风格选择最适合的实现方式。

标签: 模式js
分享给朋友:

相关文章

js实现vue路由

js实现vue路由

Vue路由基础实现 使用Vue Router实现前端路由需要先安装并配置路由库。Vue Router是Vue.js官方的路由管理器。 安装Vue Router: npm install vue-r…

js实现打印

js实现打印

使用window.print()方法实现打印 在JavaScript中,可以通过调用window.print()方法直接触发浏览器的打印功能。这会打开系统的打印对话框,用户可以选择打印机和设置打印选项…

js实现列表

js实现列表

使用 JavaScript 实现列表 JavaScript 提供了多种方式来实现列表功能,包括数组操作、DOM 元素动态生成等。以下是几种常见的实现方法: 使用数组存储列表数据 数组是 JavaSc…

js实现vr

js实现vr

使用WebXR API实现VR体验 WebXR是浏览器中实现VR和AR体验的标准API,它取代了早期的WebVR。现代浏览器如Chrome、Edge和Firefox已支持WebXR。 // 初始化W…

js实现祖玛

js实现祖玛

实现祖玛游戏的核心思路 祖玛游戏的核心玩法是发射彩色珠子,形成三个或以上相同颜色的珠子即可消除。以下是使用JavaScript实现的基本框架。 游戏初始化 创建画布并初始化游戏状态: const…

js节流实现

js节流实现

节流的概念 节流(Throttle)是一种限制函数执行频率的技术,确保函数在一定时间间隔内只执行一次。常用于滚动事件、窗口调整等高频触发的场景。 基础实现方法 使用时间戳判断是否执行函数: fun…