为什么Jest中myMock.mock.instances的输出与文档示例、本地运行结果存在差异
Jest Mock 的
mock.instances 输出差异原理解析 一、官方文档尖括号标记的真实含义
文档示例里标注的[ <a>, <b> ]不是控制台输出的字面格式,是文档写作时使用的对象引用占位符:
- 尖括号本身没有特殊语法意义,只是用来快速标记「数组中的元素分别对应某次调用的上下文对象」,跳过具体打印细节突出逻辑关系
<a>指代代码中通过new myMock()生成的实例对象a<b>指代代码中被bind绑定的普通空对象b
二、本地运行结果的生成逻辑
mock.instances属性的核心规则是:按照调用先后顺序,依次存储每一次执行mock函数时,函数内部的this指向值。对应给出的代码,执行过程和数组内容完全可逐行对应:
- 执行
const a = new myMock()时,根据JS的new调用规则,函数内部的this会指向新创建的空实例(也就是最终赋值给a的对象),这个值会被存入instances数组的第一位。 - 执行
bound()(即bind到对象b上的myMock调用)时,函数内部的this被硬绑定到b上,这个b对象会被存入instances数组的第二位。
本地看到的输出[ mockConstructor {}, {} ]完全匹配上述逻辑:
- 第一个元素
mockConstructor {}:就是new生成的实例a。因为jest.fn()生成的mock构造函数是匿名的,Node控制台打印这类匿名构造函数生成的实例时,会自动用mockConstructor作为默认类型标签,本质上和文档示意的<a>是同一个对象,不存在内容差异。 - 第二个元素
{}:就是bind绑定的对象b,因为b是没有任何属性的普通空对象,Node直接打印为{},和文档示意的<b>完全对应。
三、输出形式存在差异的本质原因
文档示例和本地结果的形式差异,本质是不同运行环境的控制台渲染规则不同,并非Jest的mock存储逻辑有区别:
- 文档中的尖括号是排版简化的示意标记,从来不是真实的控制台输出格式
- Node环境对匿名构造函数实例的默认类型标签、不同版本Node对空对象的渲染样式,都属于控制台的展示层差异,不会改变instances的存储逻辑:数组永远严格按照调用顺序,记录每一次调用时的真实this值。
内容的提问来源于stack exchange,提问作者user9650660
相关产品推荐
相关产品推荐

