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

} 

Przestawianie metody atrybutu set i wydaje się, że metoda get muszą być zastąpione także inaczej undefined jest zwracane (metoda get nie jest dziedziczona odkomentowując podklasa get property() powyższa metoda i wszystko działa poprawnie).przesłonięcia ustawiającej i getter musi być zmienione

Zakładam, że jest to część specyfikacji. Podejście to nastąpiłoby, gdyby zachowanie było konsekwencją kompilacji krzyżowej. Aby upewnić się, czy jest to właściwy sposób kodowania zmienionych setterów i modułów pobierających (zarówno w tym samym czasie, jak iw ogóle)?

+0

Czy możesz edytować swój przykład, aby setter/getter nie tylko dzwonił super? – Bergi

+1

Może to być pomocne: http://stackoverflow.com/questions/27400010/object-prototype-definegetter-and-definesetter-polyfill/27400162#27400162. Omawia problem w kategoriach '__defineGetter__' itp., Ale zasada jest taka sama: jeśli definiujesz/definiujesz setter na właściwości, która już posiada element pobierający, musisz pobrać getter i zresetować go wraz z ustawianiem . –

Odpowiedz

5

Tak, jest to zamierzone (część specyfikacji). Jeśli obiekt ma własność własną (.property w twoim przykładzie), ta właściwość zostanie użyta, a nie dziedziczna. Jeśli ta właściwość istnieje, ale jest właściwością akcesor bez gettera, wówczas zostanie zwrócona wartość undefined.

Należy zauważyć, że to zachowanie nie zmieniło się z wersji ES5.

+0

Przełączono na CoffeeScript mniej więcej w tym samym czasie, co ES5, przed tym '' define defineCetter __() '/ setter nigdy nie będzie standaryzowany. – user5321531

+0

@Bergi Z ciekawości, jeśli mógłbyś wskazać tę część specyfikacji, która to oznajmiała, byłabym wdzięczna. Próbowałem przeszukać zarówno specyfikacje ES5 i ES6, ale żadna z nich nie wydaje się jawnie nic o przesłonach pobierających lub ustawiających. – brianpeiris

+0

@brianpeiris: "Nadpisywanie" ma miejsce w ['[[DefineOwnProperty]]'] (http://www.ecma-international.org/ecma-262/6.0/#sec-ordinary-object-internal-methods-and -internal-slots-defineownproperty-p-desc), który jest wywoływany z [dosłownych definicji właściwości] (http://www.ecma-international.org/ecma-262/6.0/#sec-method-definitions-runtimesemsics -propertydefinitionevaluation) lub przez ['Object.defineProperty'] (http://www.ecma-international.org/ecma-262/6.0/#sec-object.defineproperty) (ES5 działa w zasadzie tak samo, chociaż odpowiednie sekcje specyfikacji może być łatwiejszy do odczytania) – Bergi