JavaScript 中如何获取子类?

如题,使用 es6 class 定义的类,如何获取指定基类的所有子类呢?

例如下面定义了三个类 A, B, C

class A {}
class B extends A{}
class C extends A{}

吾辈如何获取到 A 的所有子类呢?(=^-ω-^=)


有人说这个问题毫无意义,难道泥萌没有遇到过根据状态切换多种操作的情况么?难道一个一个的使用 if-else 判断会比使用 class 实现多态更优雅么?┐( ̄ヮ ̄)┌

阅读 10.9k
12 个回答

吾辈受到采纳答案的启发找到了正确的方法

class A {}

const builder = (clazzMap => {
  return new class {
    // 注册一个 class,创建子类时调用,用于记录每一个 [状态 => 子类] 对应
    register(status, clazz) {
      clazzMap.set(status, clazz)
      return this.clazz
    }
    /**
     * 获取一个标签子类对象
     * @param {Number} index 索引
     * @returns {Tab} 子类对象
     */
    getInstance(index) {
      const clazz = clazzMap.get(index)
      return new clazz()
    }
  }()
})(new Map())
builder.register(1, class B extends A {})
builder.register(2, class C extends A {})
附:问题整合成了一篇博客,欢迎来这边玩 https://blog.rxliuli.com/p/e1...
const Achild = []

class A {
  constructor(){
    if(this.constructor !== A){
      Achild.push(this)
    }
  }
}

class B extends A{}

class C extends A{}

new A()
new B('李')
new C(13)

console.log(Achild) // [B, C]

没有办法.
为什么要获取子类? 完全没有意义啊

一般只有编辑器或者需要检测结构的时候才需要获取子类,其他的应用场景都不需要吧

除非自己在A类上添加代码实现, 否则 A类也不知道有哪些类会继承它

用ide的find usage(不能保证全找到),运行时在js抽象内没有靠谱的判断方法
你要有能力去hack js引擎应该是有方法的

extends 只是一个"声明",真正起作用还是需要子类实例化的时候。
虽然子类实例化的时候会默认调用父类的constructor,并可以依此获取到子类实例,及其constructor,间接获取到子类class;
但看你需求好像并不能做到这一点,的确用工厂函数更合适一些。

class A {}
function classFactory(status){
    return class extends A {}
}
var B = classFactory(status)

通过工厂方法构建子类,那么所有的子类都是可追溯的了

新手上路,请多包涵

我觉得这个问题没有意义啊,有什么需要继承的,在父类声明就好了,你是有什么业务场景吗

毫无意义的问题

function trackable(construct) {
  if (typeof construct !== 'function') throw 'trackable only accept a function';
  construct.childClass = []
  function TempFN () {}
  return new Proxy(construct, {
    construct: function(construct, args, real) {
      construct.childClass.push(real);
      TempFN.prototype = real.prototype;
      return Object.assign(new TempFN(), new construct(args))
    }
  })
}


class Parent {
  constructor(props) {
    this.age = props
  }
  hello () {
    console.log(1);
  }
}
Parent = trackable(Parent) // 装饰一下
class B extends Parent{}
class D extends Parent {}
new B()
new D(
console.log(Parent.childClass);
// [class B, class D]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏