Я пытаюсь распечатать имя класса B или C в его суперклассе (A). Есть ли способ вывести это как-то из контекста? Должен ли я передать имена в супер в качестве параметра или есть лучший способ сделать это?

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();
}
5
Ryan-Neal Mes 12 Дек 2016 в 12:44

3 ответа

Лучший ответ

Да, есть два способа доступа к нему там, где вы показали:

  • 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 metaproperty доступно в функциях, чтобы указать, какой была целевая функция выражения new.


Примечание: если ваш конструктор подкласса является не чем иным, как вызовом конструктора суперкласса, вы можете полностью его исключить. Движок JavaScript добавит один для вас.

10
T.J. Crowder 12 Дек 2016 в 10:02
this.constructor.name

Должен сделать свое дело.

1
user663031user663031 12 Дек 2016 в 09:48

Экземпляр может получить свою функцию конструктора через this.constructor. Имя функции доступно в виде свойства .name. Итак, это удивительно просто:

console.log(this.constructor.name)
1
deceze 12 Дек 2016 в 09:47