Получить родительское имя класса из дочернего с ES6?

Я хотел бы получить имя родительского класса (Parent), но я могу получить только имя дочернего класса с этим кодом (Child)...

'use strict';

class Parent {

}

class Child extends Parent {

}

var instance = new Child();
console.log(instance.constructor.name);

Ответы

Ответ 1

ES6 классы наследуют друг от друга. Поэтому, когда instance.constructor относится к Child, вы можете использовать Object.getPrototypeOf(instance.constructor) для получения Parent, а затем получить доступ к .name:

Object.getPrototypeOf(instance.constructor).name == "Parent";

Конечно, для этого необходимо обеспечить полное соблюдение ES6 и неминифицированный код. Вы никогда не должны полагаться на имена функций в коде.

Ответ 2

Вот что-то забавное:

class J {}
    
class K extends J {}

class L extends K {}

function getBaseClass(targetClass){
  if(targetClass instanceof Function){
    let baseClass = targetClass;

    while (baseClass){
      const newBaseClass = Object.getPrototypeOf(baseClass);

      if(newBaseClass && newBaseClass !== Object && newBaseClass.name){
        baseClass = newBaseClass;
      }else{
        break;
      }
    }

    return baseClass;
  }
}

console.log(getBaseClass(L)); // Will return J.

Ответ 3

Вы можете технически сделать

// instanceProto === Child.prototype
var instanceProto = Object.getPrototypeOf(instance);

// parentProto === Parent.prototype
var parentProto = Object.getPrototypeOf(instanceProto);
console.log(parentProto.constructor.name);

Имейте в виду, что эти имена заставляют все искажать minifiers.