2015-12-24 18 views
11

Mi chiedo se ciò che segue è in conformità con le specifiche ES6:È possibile chiamare un super setter nelle classi ereditate da 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"; 
    } 
} 

L'idea è che let y = new Y(""); y.name = "hi" dovrebbe risultare in y.name === "hiXY" essere vera.

Per quanto posso dire, questo non funziona in Chrome con il flag ES6 attivato. Inoltre, non funziona con Babel con il flag es2015. Sta usando super.name = ... in un setter ereditato che non fa parte delle specifiche ES6? O si tratta di un bug nell'implementazione di Babel?

+2

Definire "non funziona"? Stai sovrascrivendo 'get name' dalla classe base definendo' set name' sul child senza un matching 'get name() {return super.name; } '. È questo il problema? – loganfsmyth

+0

@ DenysSéguret No, perché voglio che il setter del super venga eseguito (aggiungendo una X alla fine del nome). – TAGraves

+1

@loganfsmyth Hai ragione! Non mi ero reso conto che la definizione di "nome set" avrebbe annullato "ottieni nome". Sembra funzionare una volta che aggiungo anche il getter! Grazie! – TAGraves

risposta

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

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

si sovrappone name correttamente con una funzione di accesso per solo il setter, senza getter. Ciò significa che il tuo y.name === "hiXY" non riuscirà perché y.name restituirà undefined perché non c'è getter per name. Avete bisogno di:

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

    get name(){ 
    return super.name; 
    } 

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