为何这段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,提问作者Себастиан Сбербанко
相关产品推荐
相关产品推荐

