代码之家  ›  专栏  ›  技术社区  ›  xpt

ES6,必须在访问“this”和在派生类中定义常量之前调用super

  •  0
  • xpt  · 技术社区  · 7 年前

    关键是,对于我的特殊情况,这个常数是 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() {
      return new Map()
        .set("name1", arg11, arg12)
        .set("name2", arg21, arg22)
    }
    

    有没有可能以某种方式使它起作用? https://jsbin.com/xubijosuro/edit?js,console,output

    注:以下是我如何使用 亚CMD2 等:

    const cli = new CliCaseA(name, argsObj) 
    const usage = cli.Usage() 
    if (usage) { console.log(`Usage:\n\n${usage}`) process.exit() }
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Bergi    7 年前

    您正在寻找类(或getter或方法)的静态属性,甚至在 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
      }
    }