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

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

  •  28
  • TAGraves  · 技术社区  · 10 年前

    我想知道以下内容是否符合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 旗帜正在使用 super.name = ... 不是ES6规范的一部分?或者这是Babel实现中的一个错误?

    1 回复  |  直到 10 年前
        1
  •  56
  •   loganfsmyth    10 年前
    class Y extends X {
      constructor(name) {
        super(name);
      }
    
      set name(name) {
        super.name = name;
        this._name += "Y";
      }
    }
    

    将覆盖 name 正确使用的访问者 只是 setter,没有getter。这意味着你 y.name === "hiXY" 将失败,因为 y.name 将返回 undefined 因为没有吸气剂 名称 。您需要:

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