web-dev-qa-db-ja.com

ES6継承クラスでスーパーセッターを呼び出すことは可能ですか?

以下がES6仕様に準拠しているかどうか疑問に思います。

class X {
  constructor(name) {
    this._name = name;
  }

  get name() {
    return this._name;
  }

  set name(name) {
    this._name = name + "X";
  }
}

class Y extends X {
  constructor(name) {
    super(name);
  }

  set name(name) {
    super.name = name;
    this._name += "Y";
  }
}

let y = new Y(""); y.name = "hi"y.name === "hiXY"がtrueになるはずです。

私の知る限り、これはES6フラグがオンになっているChromeでは機能しません。また、es2015フラグが付いたBabelでは機能しません。継承されたセッターでsuper.name = ...を使用しています。 ES6仕様の一部ではありませんか?それとも、これはBabelの実装のバグですか?

20
TAGraves
class Y extends X {
  constructor(name) {
    super(name);
  }

  set name(name) {
    super.name = name;
    this._name += "Y";
  }
}

namejustセッターのアクセサーで適切にオーバーライドします。ゲッターはありません。それはあなたのy.name === "hiXY"は、y.nameは、undefinedのゲッターがないため、nameを返します。必要なもの:

class Y extends X {
  constructor(name) {
    super(name);
  }

  get name(){
    return super.name;
  }

  set name(name) {
    super.name = name;
    this._name += "Y";
  }
}
28
loganfsmyth

この場合、より簡単な解決策があります。


class Y extends X {
    set name(name) {
        super.name = name;
        this._name += "Y";
    }
}