You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何这段JavaScript代码未实现单例模式?修改后能否成为单例?

关于单例模式的两个问题解答

1. 原代码未实现单例模式的原因

单例模式的核心要求是整个系统中仅存在一个对象实例,但这段代码的问题在于:

  • getInsctance方法每次被调用时,都会执行createInstance()创建一个全新的对象返回。
  • 虽然闭包里的counter是共享变量,导致r和r2操作的是同一个计数器,但r和r2本身是两个完全独立的对象实例,不符合单例模式“唯一实例”的核心规则。

你可以打印r === r2验证,结果会是false,直接证明二者是不同对象。

2. 修改返回逻辑后能否实现单例模式

将getInsctance的返回逻辑改为instance || (instance = createInstance())(注意修正拼写错误:原代码里的insctance要改成instance),可以实现单例模式,原因如下:

  • 闭包中的instance变量会被持久保存,第一次调用getInsctance时,instance为undefined,会执行instance = createInstance()创建实例并赋值;
  • 后续再调用getInsctance时,instance已经存在,会直接返回已创建的实例,保证每次调用拿到的都是同一个对象。

修改后打印r === r2会返回true,完全符合单例模式“唯一实例”的要求。

内容的提问来源于stack exchange,提问作者Себастиан Сбербанко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 17:12:37