【问题标题】:Is there a way to get name of child class in parent class?有没有办法在父类中获取子类的名称?
【发布时间】:2016-12-12 09:44:32
【问题描述】:

我试图在它的超类 (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


    【解决方案1】:

    是的,您可以通过两种方式访问​​它:

    • this.constructor.name(假设没有任何问题),您可以在任何可以访问实例的地方使用它
    • new.target.name(仅在构造函数中可用,new.target 在不属于 new 操作的函数调用中是 undefined

    但除了日志记录等目的之外,超类很少需要了解子类的任何信息。

    例子:

    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 完美运行。我在我的场景中需要基类,只是为了发布而简化。谢谢
    • 我想在父类的静态方法中获取子类的名字
    • @AmarjitSingh - 我建议用代码说明问题。但是,根据调用静态方法的方式,您可以使用this.name 来执行此操作(因为通常调用静态方法的方式意味着this 指的是构造函数):jsfiddle.net/5f1rxme4
    • @T.J.Crowder 这是我的问题的链接。 stackoverflow.com/questions/54529306 还有一个类似的问题,但这是针对 PHP 的。 stackoverflow.com/questions/3391542
    【解决方案2】:

    实例可以通过this.constructor 获取其构造函数。函数名称可用作属性.name。所以,这出人意料地直截了当:

    console.log(this.constructor.name)
    

    【讨论】:

      【解决方案3】:
      this.constructor.name
      

      应该做的伎俩。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-28
        • 1970-01-01
        • 2011-05-19
        • 2021-11-09
        • 2011-05-16
        • 1970-01-01
        • 1970-01-01
        • 2021-05-10
        相关资源
        最近更新 更多