Подтвердить что ты не робот

Можно ли назвать супер сеттер в 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" будет истинным.

Насколько я могу судить, это не работает в Chrome с включенным флагом ES6. Он также не работает с использованием Babel с флагом es2015. Использует ли super.name = ... унаследованный сеттер, не являющийся частью спецификации ES6? Или это ошибка в реализации Babel?

4b9b3361

Ответ 1

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

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

будет правильно переопределять name с помощью аксессора только для установщика, без геттера. Это означает, что ваш y.name === "hiXY" не сработает, потому что y.name вернет undefined, потому что для name отсутствует getter. Вам нужно:

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

  get name(){
    return super.name;
  }

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

Ответ 2

для этого случая у вас есть более простое решение:


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