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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 23:35:40