JavaScript中实现类继承时自动递增的层级计数器
解决方案
根据你的需求,我们可以通过几种不同的方式实现继承层级数的自动统计,无需手动编写static count = super.count +1。以下是三种实用方案:
方案1:利用父类构造函数自动初始化(实例化后生效)
这种方案最简洁,仅需修改父类构造函数,子类无需额外代码,甚至不用显式定义constructor(JavaScript会自动调用super())。
class Zero { static count = 0; constructor() { // 检查当前类是否未设置count,未设置则从父类继承并递增 if (this.constructor.count === undefined) { const parentClass = Object.getPrototypeOf(this.constructor).constructor; this.constructor.count = parentClass.count + 1; } } get count() { return this.constructor.count; } } // 子类无需手动添加任何静态属性 class One1 extends Zero {} class One2 extends Zero {} class Two extends One1 {} let one1 = new One1(); let one2 = new One2(); let two = new Two(); one1.count // 返回1 one2.count // 返回1 two.count // 返回2
说明:
- 当子类第一次被实例化时,父类构造函数会自动获取父类的
count值,加1后赋值给子类的静态count。 - 缺点:子类的静态
count只有在实例化后才会被设置,直接访问One1.count在实例化前会得到undefined。
方案2:使用装饰器(实例化前即可访问静态count)
如果需要在子类定义后立即访问静态count,可以用装饰器语法在类定义阶段自动设置属性(注意:装饰器是ECMAScript Stage 3提案,需启用实验性支持或通过Babel转译)。
// 装饰器函数:自动为子类计算继承层级 function autoInheritCount(target) { const parentClass = Object.getPrototypeOf(target.prototype).constructor; target.count = parentClass.count + 1; return target; } class Zero { static count = 0; get count() { return this.constructor.count; } } @autoInheritCount class One1 extends Zero {} @autoInheritCount class One2 extends Zero {} @autoInheritCount class Two extends One1 {} One1.count // 返回1(实例化前即可访问) new One1().count // 返回1 new Two().count // 返回2
说明:
- 装饰器在类定义时立即执行,直接为子类设置静态
count,无需等待实例化。 - 适合需要提前获取类层级的场景。
方案3:工厂函数创建子类(无实验性语法,兼容性好)
如果需要兼容旧环境,且希望实例化前就能访问静态count,可以用工厂函数封装子类创建逻辑:
class Zero { static count = 0; get count() { return this.constructor.count; } } // 工厂函数:自动创建带层级计数的子类 function createHierarchyClass(Parent) { class Subclass extends Parent {} Subclass.count = Parent.count + 1; return Subclass; } const One1 = createHierarchyClass(Zero); const One2 = createHierarchyClass(Zero); const Two = createHierarchyClass(One1); One1.count // 返回1 new One1().count // 返回1 new Two().count // 返回2
说明:
- 无需任何实验性语法,所有现代环境都支持。
- 通过函数封装继承逻辑,避免重复代码。
内容的提问来源于stack exchange,提问作者Quentin
相关产品推荐
相关产品推荐

