首页 > web前端 > js教程 > 正文

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

煙雲
发布: 2025-08-01 11:04:01
原创
845人浏览过

单例模式确保一个类只有一个实例并提供全局访问点;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
登录后复制
添加方法,所有单例实例都可以访问这些方法。 这样做的好处是,可以更容易地扩展单例的功能,并且代码更具可读性。

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

优点:

超级简历WonderCV
超级简历WonderCV

免费求职简历模版下载制作,应届生职场人必备简历制作神器

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

缺点:

  • 全局状态: 单例本质上是一种全局状态,过度使用可能导致代码难以测试和维护。
  • 违反单一职责原则: 单例类既负责创建自身,又负责提供功能。
  • 并发问题: 在多线程环境下,需要考虑线程安全问题。 (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)。

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

希望这些能帮到你。

以上就是js怎么用原型实现单例模式的详细内容,更多请关注php中文网其它相关文章!

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

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