有没有办法在父类中获取子类的名称?

问题描述 投票:0回答:3

我正在尝试打印其超类(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();
}
javascript
3个回答
27
投票

是的,您可以通过两种方式访问您所显示的位置:

  • 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 引擎将为您添加一个。


1
投票

实例可以通过

this.constructor
获取其构造函数。函数的名称可用作属性
.name
。所以,它非常简单:

console.log(this.constructor.name)

1
投票
this.constructor.name

应该可以解决问题。

© www.soinside.com 2019 - 2024. All rights reserved.