我怎么能以某种方式找出我在类层次结构中的构造函数?

时间:2015-10-28 22:09:01

标签: oop typescript

假设我有3个这样的TypeScript类:

class A {
  A1 = "";
  A2 = 4;
  constructor() {}
}

class B extends A {
  B1 = "424";
  constructor() {
    super();
  }
}

class C extends B {
  C1 = false;
  constructor() {
    super();
  }
}

当我创建A,B或C的实例时,我需要运行一些循环遍历对象属性的例程。由于TypeScript的构造函数和字段初始化程序逻辑的设计,例如当我构造一个B实例时,在A构造函数的末尾,我的对象中还没有B属性。这使我确保在构造函数链的底部调用这个“字段循环内容”初始化逻辑。

所以这引出了我的问题:当编写例如B的构造函数时,我能否以某种方式检查我是在构建一个B实例,还是一个C?在后者中,我将跳过初始化逻辑并将其保留为C构造函数。

我希望问题和动机是可以理解的。

PS:我知道如果我不在任何地方使用字段初始化器,但是在调用super()之前初始化构造函数中的每个字段,那么问题就会消失,因为在最顶层的构造函数中我会拥有所有需要的领域。但是,我喜欢字段初始值设定项的语法,在这种情况下,它会生成更易读,更小的代码。

1 个答案:

答案 0 :(得分:1)

  

在编写例如B&#39的构造函数时,我能否以某种方式检查我构建B实例,还是C?在后者中,我将跳过初始化逻辑并将其保留为C构造函数

您可以使用constructor属性。

样品:

class A {
  A1 = "";
  A2 = 4;
  constructor() {
      if (this.constructor == A) this.loopAfterInit();
  }

  loopAfterInit(){console.log(Object.keys(this))}
}

class B extends A {
  B1 = "424";
  constructor() {
    super();
    if (this.constructor == B) this.loopAfterInit();
  }
}

class C extends B {
  C1 = false;
  constructor() {
    super();
    if (this.constructor == C) this.loopAfterInit();
  }
}


new A(); // A props logged
new B(); // A,B props logged
new C(); // A,B,C props logged