Как получить первый класс, который класс расширяет, не создавая экземпляр - PullRequest
3 голосов
/ 17 октября 2019

Имея подобную или похожую структуру с несколькими уровнями наследования:

class Abstract {};
class Concrete extends Abstract {};
class MoreSpecificConcrete extends Concrete {};
class EvenMoreSpecificConcrete extends MoreSpecificConcrete {};

Я хочу знать последний класс перед Function, от которого EvenMoreSpecificConcrete наследуется.

1 Ответ

3 голосов
/ 17 октября 2019

Вы можете рекурсивно пройти проверку цепочки прототипов, если оказались в прототипе функции (который расширяет каждая функция), и вернуть последний элемент перед этим.

function getBaseClass(MaybeClass) {
  if (typeof MaybeClass !== 'function') return;

  const Proto = Reflect.getPrototypeOf(MaybeClass);
  return (Proto === Function.prototype || Proto === null)
    ? MaybeClass
    : getBaseClass(Proto);
}

Затем можно сравнить возвращенный классс рефератом:

getBaseClass(EvenMoreSpecificConcrete) === Abstract;

Скрипка: https://jsfiddle.net/9nLuvyob/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...