我正在尝试打印其超类(A)中B类或C类的名称。有没有办法从上下文中以某种方式推断出这一点?我是否必须将名称作为参数传递给 super 或者有更好的方法吗?
class A {
constructor(){
console.log(klass_name) // klass_name is some code to get the name of class B,C
}
}
class B extends A {
constructor() {
super();
}
}
class c extends A {
super();
}
是的,您可以通过两种方式访问您所显示的位置:
new.target.name
(仅在构造函数中可用;new.target
在不属于 new
操作的函数调用中未定义)this.constructor.name
(假设没有发生任何混乱),您可以在可以访问实例的任何地方使用它但是除了记录目的等之外,超类很少需要了解有关子类的任何信息。
示例:
class A {
constructor(){
console.log("this.constructor.name = " + this.constructor.name);
console.log("new.target.name = " + new.target.name);
}
}
class B extends A {
}
class C extends A {
}
new C;
constructor
属性会自动在类的原型上设置以引用类的构造函数,并且从 ES2015 开始,函数(包括构造函数)有一个 name
属性来给出它们的名称。由于实例继承自原型,因此您可以在其上使用 constructor
来访问该构造函数及其 name
。
new.target
语法来指示在 new
表达式中直接使用哪个构造函数。
旁注:当你的子类构造函数只是对超类构造函数的调用时,你可以完全忽略它。 JavaScript 引擎将为您添加一个。
实例可以通过
this.constructor
获取其构造函数。函数的名称可用作属性 .name
。所以,它非常简单:
console.log(this.constructor.name)
this.constructor.name
应该可以解决问题。