Обнаружение статического супер-метода в классе ES6 - PullRequest
0 голосов
/ 12 января 2019

У меня есть один базовый класс и подкласс. Я хочу, чтобы у моих типов классов был статический метод, который идентифицирует его по строке. (Таким образом, я могу выполнить поиск в объекте для обработчиков типа. Я могу вставить класс непосредственно в него, но преобразует весь источник класса в строку и использует его в качестве ключа, что кажется неоптимальным.)

Мне нужно:

  • обнаружение присутствия суперкласса
    • позвоните super.id(), затем добавьте свой id()
  • если нет супер, просто отправь мою id()

Вот как я могу представить код для написания, но super.id не определен, поэтому if всегда завершается ошибкой. Проверка на if (super) {} также завершается с ошибкой синтаксиса, а super.id() завершается сбоем, поскольку это "не функция".

class Y {
  static id() {
    if (super.id) {
      return `${super.id()}-${this.name}`;
    }
    else {
      return this.name;
    }
  }
}

class YY extends Y {}

// Outputs "Y YY", but I want "Y Y-YY"
console.log(Y.id(), YY.id()) 

Я мог бы определить static id() {} метод в YY, но тогда мне пришлось бы делать это вручную во всех моих подклассах, что подвержено ошибкам. Возможна ли такая вещь?

1 Ответ

0 голосов
/ 12 января 2019

Вы можете использовать Object.getPrototypeOf вместо super:

class Y {
  static id() {
    if (Object.getPrototypeOf(this).id) {
      return `${Object.getPrototypeOf(this).id()}-${this.name}`;
    }
    else {
      return this.name;
    }
  }
}

class YY extends Y {}

console.log(Y.id(), YY.id()) 

С super это не работает, поскольку это всегда относится к прототипу класса Y. Но this точно соответствует объекту, для которого вам нужен прототип, поэтому с Object.getPrototypeOf(this).id вы получите хорошее всплеск в цепочке прототипов.

...