0

0

js怎么用原型实现单例模式

煙雲

煙雲

发布时间:2025-08-01 11:04:01

|

855人浏览过

|

来源于php中文网

原创

单例模式确保一个类只有一个实例并提供全局访问点;2. javascript中常用闭包和iife实现,通过私有变量instance和getinstance方法保证实例唯一性;3. 可通过原型链扩展单例功能,将方法挂载到构造函数原型上;4. 优点包括唯一访问点、节省资源、延迟初始化,缺点有全局状态难测试、违反单一职责、潜在并发问题;5. 也可用es6的class和static属性实现,通过静态属性存储实例并在构造函数中控制返回;6. 常见应用场景包括全局配置、数据库连接池、日志记录器、缓存管理器和状态管理器;7. 单例适用于需唯一实例的场景,但应谨慎使用以避免维护困难。

js怎么用原型实现单例模式

单例模式,简单来说,就是确保一个类只有一个实例,并提供一个全局访问点。在 JavaScript 中,原型链提供了一种优雅的方式来实现这一点,既能保证单例,又能充分利用 JavaScript 的特性。

js怎么用原型实现单例模式

直接上代码,然后再细说:

const Singleton = (function() {
  let instance;

  function createInstance() {
    // 这里放你的单例初始化逻辑
    const object = new Object("Singleton 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

为什么用原型? 严格来说,上面的代码并没有直接使用原型,而是利用了闭包和立即执行函数表达式 (IIFE)。但原型在单例的扩展中可以发挥作用,我们稍后会提到。

js怎么用原型实现单例模式

核心思路: 利用闭包隐藏

instance
变量,
getInstance
方法负责创建和返回实例。只有第一次调用
getInstance
时才会创建实例,后续调用都返回同一个实例。

如何确保单例的唯一性?

关键在于

instance
变量的作用域。它被定义在 IIFE 内部,外部无法直接访问。
getInstance
方法通过闭包访问并控制
instance
的创建和返回。 每次调用
getInstance
,都会先检查
instance
是否存在,如果不存在才创建,否则直接返回已存在的实例。 这就保证了无论调用多少次
getInstance
,都只会创建一个实例。

js怎么用原型实现单例模式

如何扩展单例的功能?

虽然上面的基本单例模式已经可以工作,但如果需要扩展单例的功能,比如添加方法或属性,可以利用原型链。

const Singleton = (function() {
  let instance;

  function SingletonClass() {
    // 初始化逻辑
    this.data = [];
  }

  SingletonClass.prototype.addData = function(item) {
    this.data.push(item);
  }

  SingletonClass.prototype.getData = function() {
    return this.data;
  }

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

const instance1 = Singleton.getInstance();
instance1.addData("item1");
console.log(instance1.getData()); // ["item1"]

const instance2 = Singleton.getInstance();
console.log(instance2.getData()); // ["item1"]  注意:instance1和instance2是同一个实例

解释: 这里我们定义了一个

SingletonClass
,并将单例的逻辑放在这个类中。 通过
SingletonClass.prototype
添加方法,所有单例实例都可以访问这些方法。 这样做的好处是,可以更容易地扩展单例的功能,并且代码更具可读性。

单例模式的优缺点是什么?

优点:

响应式黑色展台设计整站模板1.4.2
响应式黑色展台设计整站模板1.4.2

响应式黑色展台设计整站模板,自带内核安装即用,图片文本实现可视化,方便修改,支持多种内容模型及自定义功能,可根据需要自行添加。模板特点: 1、安装即用,自带人人站CMS内核及企业站展示功能(产品,新闻,案例展示等),并可根据需要增加表单 搜索等功能(自带模板) 2、支持响应式 3、前端banner轮播图文本均已进行可视化配置 4、伪静态页面生成 5、支持内容模型、多语言、自定义表单、筛选、多条件搜

下载
  • 全局唯一访问点: 方便访问和管理。
  • 节省资源: 避免重复创建对象,尤其是在创建对象开销较大的情况下。
  • 可以延迟初始化: 只在需要时才创建实例。

缺点:

  • 全局状态: 单例本质上是一种全局状态,过度使用可能导致代码难以测试和维护。
  • 违反单一职责原则: 单例类既负责创建自身,又负责提供功能。
  • 并发问题: 在多线程环境下,需要考虑线程安全问题。 (JavaScript 是单线程的,所以这个问题通常可以忽略,除非你在使用 Web Workers)

除了闭包,还有其他实现单例模式的方法吗?

当然有。 虽然闭包是最常见的方式,但也可以使用 ES6 的

class
static
属性来实现:

class Singleton {
  static instance;

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

  addData(item) {
    this.data.push(item);
  }

  getData() {
    return this.data;
  }
}

const instance1 = new Singleton();
instance1.addData("item1");
console.log(instance1.getData()); // ["item1"]

const instance2 = new Singleton();
console.log(instance2.getData()); // ["item1"]

解释:

  • static instance
    :静态属性,用于存储单例实例。
  • constructor
    :构造函数,如果
    Singleton.instance
    已经存在,则直接返回已存在的实例,否则创建新实例并赋值给
    Singleton.instance

这种方式更简洁,也更符合面向对象的编程风格。 但需要注意的是,这种方式在 ES6 之前是无法实现的。

单例模式在实际开发中有哪些应用场景?

单例模式在实际开发中有很多应用场景,例如:

  • 全局配置对象: 存储应用程序的配置信息,例如 API 地址、主题颜色等。
  • 数据库连接池: 管理数据库连接,避免频繁创建和销毁连接。
  • 日志记录器: 统一管理日志输出。
  • 缓存管理器: 管理缓存数据。
  • 状态管理器: 管理应用程序的状态 (例如 Redux 中的 store)。

总的来说,单例模式适用于需要全局唯一访问点,并且只需要一个实例的场景。 但是,需要谨慎使用,避免过度使用导致代码难以维护。

希望这些能帮到你。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
es6新特性
es6新特性

es6新特性有:1、块级作用域变量;2、箭头函数;3、模板字符串;4、解构赋值;5、默认参数;6、 扩展运算符;7、 类和继承;8、Promise。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

106

2023.07.17

es6新特性有哪些
es6新特性有哪些

es6的新特性有:1、块级作用域;2、箭头函数;3、解构赋值;4、默认参数;5、扩展运算符;6、模板字符串;7、类和模块;8、迭代器和生成器;9、Promise对象;10、模块化导入和导出等等。本专题为大家提供es6新特性的相关的文章、下载、课程内容,供大家免费下载体验。

195

2023.08.04

JavaScript ES6新特性
JavaScript ES6新特性

ES6是JavaScript的根本性升级,引入let/const实现块级作用域、箭头函数解决this绑定问题、解构赋值与模板字符串简化数据处理、对象简写与模块化提升代码可读性与组织性。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

222

2025.12.24

go语言 面向对象
go语言 面向对象

本专题整合了go语言面向对象相关内容,阅读专题下面的文章了解更多详细内容。

56

2025.09.05

java面向对象
java面向对象

本专题整合了java面向对象相关内容,阅读专题下面的文章了解更多详细内容。

52

2025.11.27

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

469

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.12.06

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

525

2023.08.10

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

【web前端】Node.js快速入门
【web前端】Node.js快速入门

共16课时 | 2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号