ES6, должен вызвать super, прежде чем получить доступ к this и определению константы в производном классе - PullRequest
0 голосов
/ 10 февраля 2019

Если я хочу определить константу в базовом классе, а затем переопределить ее в подклассах, как мне это сделать?

Уловка в том, что для моего конкретного случая эта константа new Map()и результат будет проверен во время конструктора:

class Cmd0 {
  constructor(name, arg1, arg2 = null) {
    this.name = name;
    this.arg1 = arg1;
    this.arg2 = arg2;
  }
. . .
}

class Cmd extends Cmd0 {
  constructor(name, arg1, arg2 = null) {
    myMap =  Somehow.getMyMap() // defined in sub-classes
    if (!myMap.has(name)) { super(null, null, null); return } // fail the constructor
    super(name, arg1, arg2)
  }
}

class SubCmd1 extends Cmd {

  Usage() {
    if (this.name) return null
    else return "cmd sub1 bla bla bla"
  }
}

class SubCmd2 extends Cmd {

  Usage() {
    if (this.name) return null
    else return "cmd sub2 bla bla bla"
  }
}

И SubCmd1, и SubCmd2 должны определить свою собственную версию getMyMap() для использования в базовом конструкторе, прежде чем this сможетбыть доступным.

Метод getMyMap() будет иметь формат,

getMyMap() {
  return new Map()
    .set("name1", arg11, arg12)
    .set("name2", arg21, arg22)
}

Можно ли как-нибудь заставить его работать?Вы можете начать с - https://jsbin.com/xubijosuro/edit?js,console,output

PS.Вот как я использую SubCmd1, SubCmd2 и т.д:

const cli = new CliCaseA(name, argsObj) 
const usage = cli.Usage() 
if (usage) { console.log(`Usage:\n\n${usage}`) process.exit() }

1 Ответ

0 голосов
/ 10 февраля 2019

Вы ищете статическое свойство класса (или метода получения или метода), к которому можно получить доступ даже до вызова super(), используя new.target:

class MappedCmd extends Cmd {
  constructor(name, arg1, arg2 = null) {
    const myMap = new.target.getMyMap();
//                ^^^^^^^^^^
    …
    super(name, arg1, arg2)
  }
  static getMyMap() {
    return new Map(); // to be overridden or extended in the subclasses
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...