当前位置:首页 > 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实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

使用js实现

使用js实现

使用JavaScript实现 JavaScript可以通过Math.random()函数生成随机数,结合其他方法可以实现多种随机数生成需求。 // 生成0到1之间的随机小数 const random…

js树实现

js树实现

树的基本概念 树是一种非线性的数据结构,由节点和边组成。每个节点包含一个值和指向子节点的引用。树的顶部节点称为根节点,没有子节点的节点称为叶节点。 树的实现方式 在JavaScript中,树可以通过…

js实现授权

js实现授权

授权流程设计 授权流程通常涉及前端与后端的交互,常见方案包括OAuth2.0、JWT等。以JWT为例的典型流程: 用户提交凭证(如用户名密码)到认证服务 服务端验证通过后生成包含用户信息的J…