使用 === 比较两次 getinstance() 获取的实例,若返回 true 则证明是同一对象引用,单例成立;还需验证状态共享(如计数器)和边界情况(如手动重置、绕过封装等),并用 jest 的 tobe 断言自动化验证。

直接用全等运算符 === 比较两次获取的实例,是最简单有效的验证方式。只要返回 true,就说明是同一个对象引用,单例成立。
用 === 判断两个实例是否为同一引用
JavaScript 中对象比较基于引用而非值。单例的核心就是“只存在一个对象”,所以只需创建两次实例,再用 === 检查:
- 若返回
true,说明两次拿到的是同一个内存地址的对象; - 若返回
false,说明构造函数被重复执行,单例失效。
例如:
const logger1 = Logger.getInstance(); const logger2 = Logger.getInstance(); console.log(logger1 === logger2); // true ✅
检查实例内部状态是否共享
单例不仅要求引用相同,还应保证状态同步。可在第一个实例上修改属性或调用方法,再通过第二个实例读取验证:
- 给实例添加一个计数器
this.count = 0; - 调用
logger1.increment(); - 检查
logger2.getCount()是否也返回1。
如果状态一致,说明两个变量操作的是同一份数据,进一步佐证单例有效。
避免测试误判的注意事项
有些写法看似单例,实则不严谨,测试时容易漏掉隐患:
- 手动删除静态属性(如
Logger.instance = null)后再次调用,可能生成新实例; - 绕过封装直接
new Logger()(未在构造器中拦截),会破坏单例; - 模块导出对象若被重新赋值(如
export const instance = new Xxx()后又被改写),也会失效。
因此测试不仅要覆盖正常路径,还需模拟这些边界操作,确认单例逻辑仍能兜住。
配合单元测试工具做自动化断言
在 Jest 或 Vitest 中可写简洁断言:
test('Logger is a singleton', () => {
const a = Logger.getInstance();
const b = Logger.getInstance();
expect(a).toBe(b); // 引用相等
expect(a.log).toBe(b.log); // 方法也来自同一对象
});
toBe 就是 Jest 对 === 的封装,语义清晰且支持调试输出。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











