当前位置:首页 > JavaScript

js 实现单例模式

2026-04-04 07:27:24JavaScript

使用模块模式实现单例

在JavaScript中,模块模式是常见的单例实现方式。通过闭包和立即执行函数表达式(IIFE)创建私有作用域,确保单例的唯一性。

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语法可以通过静态属性和方法实现单例模式。静态属性存储唯一实例,静态方法控制实例化过程。

js 实现单例模式

class Singleton {
  static instance;

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

const obj1 = new Singleton();
const obj2 = new Singleton();
console.log(obj1 === obj2); // true

使用对象字面量实现单例

最简单的单例实现方式是直接使用对象字面量。JavaScript对象本身就是单例,无需特殊处理。

js 实现单例模式

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

Object.freeze(singleton); // 防止修改

使用Proxy实现单例

Proxy可以拦截实例化操作,确保只创建一个实例。这种方式适合需要控制实例化过程的场景。

class SingletonClass {
  constructor() {
    this.property = 'value';
  }
}

const SingletonProxy = new Proxy(SingletonClass, {
  instance: null,
  construct(target, args) {
    if (!this.instance) {
      this.instance = new target(...args);
    }
    return this.instance;
  }
});

const proxy1 = new SingletonProxy();
const proxy2 = new SingletonProxy();
console.log(proxy1 === proxy2); // true

惰性单例实现

惰性单例延迟实例化直到第一次使用时才创建实例。这种方式优化了资源使用。

const LazySingleton = (function() {
  let instance = null;

  function init() {
    return {
      random: Math.random()
    };
  }

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

console.log(LazySingleton.getInstance().random === LazySingleton.getInstance().random); // true

每种实现方式适用于不同场景,模块模式适合需要私有变量的情况,ES6类方式更符合现代JavaScript风格,对象字面量最简单,Proxy方式最灵活,惰性单例优化性能。

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

相关文章

js实现分页

js实现分页

实现分页的基本思路 分页功能通常需要处理数据分割、页码生成和用户交互。核心逻辑包括计算总页数、根据当前页截取数据、渲染页码按钮等。 前端分页实现(静态数据) 假设已有全部数据,仅需前端分页展示:…

js实现祖玛

js实现祖玛

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

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

js实现搜索

js实现搜索

实现搜索功能的方法 在JavaScript中实现搜索功能可以通过多种方式完成,以下是几种常见的实现方法。 使用数组的filter方法 通过数组的filter方法可以筛选出符合条件的数据项。假设有一个…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…