假设我有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()之前初始化构造函数中的每个字段,那么问题就会消失,因为在最顶层的构造函数中我会拥有所有需要的领域。但是,我喜欢字段初始值设定项的语法,在这种情况下,它会生成更易读,更小的代码。答案 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