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

Class.prototype概念、优势解析及Jest测试相关疑问解答

什么是Class.prototype?

在JavaScript里,类其实是构造函数的语法糖,每个类(或者说构造函数)都自带一个prototype属性,它是一个普通对象。当你用new 类名()创建实例时,所有实例都会自动继承这个prototype对象上的属性和方法——简单说,这个原型对象就是该类所有实例的“共享资源池”。

使用Class.prototype的优势
  • 节省内存:如果把方法定义在原型上,所有实例都会共享这一份方法,不用每个实例都单独存一份相同的方法代码,大幅减少内存占用。
  • 统一修改:修改原型上的方法或属性后,所有已创建和未来创建的实例都会立即生效,不用逐个修改实例。
  • 实现继承:JavaScript的原型链继承就是基于原型对象实现的,子类可以通过继承父类的prototype来复用父类的方法。
针对你示例的疑问解答

① 未实例化Service,为何不需要执行Service = new Service()?

你示例里的jest.spyOn(Service.prototype, 'execute'),目的是监视所有Service实例的execute方法调用。因为所有Service实例的execute方法,本质都是从Service.prototype上继承来的——直接操作原型对象,就能覆盖所有实例的方法行为,根本不需要先创建实例。

举个例子:如果在原型上把execute替换成一个间谍函数,那不管是之前创建的实例,还是之后用new Service()创建的新实例,调用execute时都会触发这个间谍的逻辑。

② console.log(Service.prototype)返回{},这个对象是什么?操作它有什么优势?

  • 这个空对象就是Service类的原型对象,默认情况下如果你的Service类没有显式定义方法,它看起来是空的,但它的内部原型(__proto__)其实指向Object.prototype(console默认不显示这些继承的属性)。一旦你在Service类里定义了方法,比如:
    class Service {
      execute() { /* ... */ }
    }
    
    这个execute方法会自动挂载到Service.prototype上,此时打印它就能看到{ execute: [Function] }。
  • 操作它的核心优势就是批量控制所有实例:
    • 像你示例里的jest spy,直接在原型上挂间谍,就能监控所有实例的方法调用,不用给每个实例单独加间谍;
    • 动态给类添加通用方法,所有实例都能直接调用;
    • 临时修改方法逻辑(比如测试时模拟返回值),测试完再恢复,不影响原类定义。

内容的提问来源于stack exchange,提问作者Heisenberg

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 20:15:42