如题,使用 es6 class 定义的类,如何获取指定基类的所有子类呢?
例如下面定义了三个类 A, B, C
class A {}
class B extends A{}
class C extends A{}
吾辈如何获取到 A 的所有子类呢?(=^-ω-^=)
有人说这个问题毫无意义,难道泥萌没有遇到过根据状态切换多种操作的情况么?难道一个一个的使用 if-else 判断会比使用 class 实现多态更优雅么?┐( ̄ヮ ̄)┌
如题,使用 es6 class 定义的类,如何获取指定基类的所有子类呢?
例如下面定义了三个类 A, B, C
class A {}
class B extends A{}
class C extends A{}
吾辈如何获取到 A 的所有子类呢?(=^-ω-^=)
有人说这个问题毫无意义,难道泥萌没有遇到过根据状态切换多种操作的情况么?难道一个一个的使用 if-else 判断会比使用 class 实现多态更优雅么?┐( ̄ヮ ̄)┌
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]
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]
8 回答5.8k 阅读✓ 已解决
9 回答9.2k 阅读
6 回答4.7k 阅读✓ 已解决
5 回答3.5k 阅读✓ 已解决
4 回答7.9k 阅读✓ 已解决
7 回答9.8k 阅读
5 回答7.1k 阅读✓ 已解决
吾辈受到采纳答案的启发找到了正确的方法