是否可以在ES6继承的类中调用超级setter?

时间:2015-12-24 17:39:27

标签: javascript ecmascript-6 babeljs es2015

我想知道以下内容是否符合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"成立。

据我所知,这在启用了ES6标志的Chrome中无效。它也不能使用带有es2015标志的Babel。在继承的setter中使用super.name = ...不是ES6规范的一部分吗?或者这是Babel实施中的错误吗?

2 个答案:

答案 0 :(得分:23)

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

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

将使用 setter的访问者正确覆盖name,而不使用getter。这意味着您的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";
  }
}

答案 1 :(得分:-1)

对于这种情况,您有一个更简单的解决方案:


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