我试图在它的超类(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();
}
答案 0 :(得分:9)
是的,您可以通过以下两种方式访问它:
this.constructor.name
(假设什么都没有搞乱),你可以在任何有权访问实例的地方使用new.target.name
(仅在构造函数中可用,new.target
在函数调用中undefined
不是new
操作的一部分)但除了记录目的等以外,超类很少需要知道关于子类的任何内容。
示例:
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引擎将为您添加一个。
答案 1 :(得分:1)
实例可以通过this.constructor
获取其构造函数。该函数的名称可用作属性.name
。所以,它出人意料地直截了当:
console.log(this.constructor.name)
答案 2 :(得分:1)
this.constructor.name
应该做的伎俩。