2015-12-24 20 views
11

次は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フラグをオンにしても機能しません。また、es2015フラグを持つBabelを使用しても機能しません。継承されたセッターのsuper.name = ...をES6仕様の一部に使用していませんか?あるいは、これはバベルの実装におけるバグですか?

+2

"動作しません"を定義しますか?あなたは、 'get name(){return super.name;}}と一致しないで' set name'を子に定義することによって、ベースクラスから 'get name'をオーバーライドしています。 } '。それは問題ですか? – loganfsmyth

+0

@DenysSéguretいいえ、私はスーパーのセッターが動くようにしたいので(名前の最後にXを付けてください)。 – TAGraves

+1

@loganfsmythそうですよ!私は 'set name'を定義すると' get name'が上書きされることに気づいていませんでした。それは私がゲッターを追加した後に動作するように見えます!ありがとう! – TAGraves

答えて

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

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

なしゲッターで、だけセッターのためのアクセサで正しくnameを上書きします。つまり、nameのゲッターがないため、y.nameundefinedを返すため、y.name === "hiXY"が失敗する可能性があります。あなたは必要があります:

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

    get name(){ 
    return super.name; 
    } 

    set name(name) { 
    super.name = name; 
    this._name += "Y"; 
    } 
} 
関連する問題