2015-03-09 17 views
11
class AbstractClass { 

    constructor() { 
    } 

    set property(value) { 
     this.property_ = value; 
    } 

    get property() { 
     return this.property_; 
    } 

} 

class Subclass extends AbstractClass { 

    constructor() { 
     super(); 
    } 

    set property(value) { 
     super.property = value; 
     if (!(this.property_ instanceof SubclassAssociatedClass)) throw new TypeError(); 
    } 

    //get property() { 
    // return super.property; 
    //} 

} 

ridefinire il metodo di un attributo set e appare il metodo get deve essere ignorato anche, tuttavia undefined viene restituito (cioè, il metodo get non è ereditata, uncomment la sottoclasse get property() metodo sopra e tutto funziona bene).Override un setter, e il getter deve essere anche sostituita

Presumo che questa sia una parte della specifica., Se possibile seguirebbe se il comportamento fosse una conseguenza della compilazione incrociata. Per sicurezza, è questo il modo corretto per codificare setter e getter sovrascritti (entrambi allo stesso tempo o per niente)?

+0

Puoi modificare il tuo esempio in modo che il setter/getter non stia semplicemente chiamando super? – Bergi

+1

Questo potrebbe essere utile: http://stackoverflow.com/questions/27400010/object-prototype-definegetter-and-definesetter-polyfill/27400162#27400162. Discute il problema in termini di '__defineGetter__' ecc., Ma il principio è lo stesso: se si sta definendo/ridefinendo il setter su una proprietà che ha già un getter, è necessario recuperare il getter e resettarlo insieme al setter . –

risposta

5

Sì, questo è intenzionale (una parte della specifica). Se un oggetto ha una propria proprietà (.property nell'esempio), questa proprietà verrà utilizzata e non ereditata. Se questa proprietà è esistente, ma è una proprietà accessoria senza getter, verrà restituito il valore undefined.

Si noti che questo comportamento non è stato modificato da ES5.

+0

Passato a CoffeeScript all'incirca come ES5, prima che '.__ defineGetter __()'/setter non sarebbe mai stato standardizzato. – user5321531

+0

@Bergi Per curiosità, se potessi indicare la parte della specifica che lo afferma, ti sarei grato. Ho provato a cercare sia le specifiche ES5 che ES6, ma nessuno di loro sembra dichiarare esplicitamente nulla riguardo ai getters o setters overriding. – brianpeiris

+0

@brianpeiris: la "sovrascrittura" avviene in ['[[DefineOwnProperty]]'] (http://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods-and -internal-slots-defineownproperty-p-desc), che viene chiamato da [literal property definitions] (http://www.ecma-international.org/ecma-262/6.0/#sec-method-definitions-runtime-semantics -propertydefinitionevaluation) o tramite ['Object.defineProperty'] (http://www.ecma-international.org/ecma-262/6.0/#sec-object.defineproperty) (ES5 funziona fondamentalmente lo stesso, anche se le rispettive sezioni specifiche potrebbe essere più facile da leggere) – Bergi