2015-03-09 8 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; 
    //} 

} 

eines Attributes Überschreiben der set Verfahren außer Kraft gesetzt werden, und es erscheint die get Verfahren auch außer Kraft gesetzt werden müssen, da sonst undefined zurückgegeben (dh die get Methode nicht vererbt wird, uncomment die Unterklasse get property() Methode oben und alles funktioniert gut).eine setter überschreiben und der Getter muß auch

Ich nehme an, das ist ein Teil der Spezifikation. Es würde jedoch möglicherweise folgen, wenn das Verhalten eine Konsequenz der Kreuzkompilierung war. Nur um sicher zu sein, ist dies der richtige Weg, überschriebene Setter und Getters zu kodieren (beides gleichzeitig oder gar nicht)?

+0

Können Sie Ihr Beispiel so bearbeiten, dass der Setter/Getter nicht nur super aufruft? – Bergi

+1

Dies könnte hilfreich sein: http://stackoverflow.com/questions/27400010/object-prototype-definegetter-and-definesetter-polyfill/27400162#27400162. Es behandelt das Problem in Bezug auf "__defineGetter__" usw., aber das Prinzip ist dasselbe: Wenn Sie den Setter für eine Eigenschaft definieren/neu definieren, die bereits einen Getter hat, müssen Sie den Getter abrufen und zusammen mit dem Setter zurücksetzen . –

Antwort

5

Ja, das ist beabsichtigt (ein Teil der Spezifikation). Wenn ein Objekt eine eigene Eigenschaft hat (.property in Ihrem Beispiel), wird diese Eigenschaft verwendet und keine vererbte Eigenschaft. Wenn diese Eigenschaft vorhanden ist, aber eine Accessor-Eigenschaft ohne Getter ist, wird undefined zurückgegeben.

Beachten Sie, dass dieses Verhalten von ES5 nicht geändert wurde.

+0

Zu CoffeeScript etwa zur gleichen Zeit wie ES5, vor dem '.__ defineGetter __()'/Setter wurde nie standardisiert werden. – user5321531

+0

@Bergi Aus Neugier, wenn Sie auf den Teil der Spezifikation, die dies angibt, zeigen könnten, wäre ich dankbar. Ich habe versucht, sowohl die ES5- als auch die ES6-Spezifikationen zu durchsuchen, aber keiner von ihnen scheint etwas über übergeordnete Getter oder Setter zu sagen. – brianpeiris

+0

@brianpeiris: Das "Überschreiben" geschieht in ['[[DefineOwnProperty]]'] (http://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods-and -internal-slots-defineownproperty-p-desc), die aus [literal property definitions] (http://www.ecma-international.org/ecma-262/6.0/#sec-method-definitions-runtime-semantics) aufgerufen wird (Propertydefinitionevaluation) oder über ['Object.defineProperty'] (http://www.ecma-international.org/ecma-262/6.0/#sec-object.defineproperty) (ES5 funktioniert grundsätzlich gleich, allerdings in den jeweiligen Spec-Sections kann einfacher zu lesen sein) – Bergi