2016-01-07 14 views
5

podane te dwie klasyJak iteracyjne nad właściwości w ES6/2015 klasie przykład

class Foo{ 
    f1; 

    get f2(){ 
    return "a"; 
    } 
} 

class Bar extends Foo { 
    b1; 

    get b2(){ 
    return "a"; 
    } 
} 

let bar = new Bar(); 

Jaki kod dostanie mi tę listę właściwości z instancji bar? ['f1', 'f2', 'b1', 'b2']

Here is a Babel sample


Aktualizacja

ten powinien być częścią @Marc C za odpowiedź:

Korzystanie dekorator można łatwo przekształcić non własność enumerable do własności przeliczalnego:

class Bar extends Foo { 

    @enumerable() 
    get b2(){ 
    return "a"; 
    } 

} 

Oto źródło dekorator:

function enumerable() { 
    return function(target, key, descriptor) { 
    if (descriptor) { 
     descriptor.enumerable = true; 
    } 
    }; 
} 

Here is a Babel sample

+0

to szczerze wydaje się dup z http://stackoverflow.com/questions/31054910/get-functions-of-a-class. Nie ma powodu, aby właściwości były przeliczalne. – loganfsmyth

+1

[tag: babel]: * "Biblioteka internacjonalizacji Pythona z naciskiem na aplikacje internetowe W przypadku pytań dotyczących biblioteki JavaScript, użyj [babeljs]." * –

Odpowiedz

5

To nie valid syntax for declaring properties znajduje się w klasie. Zamiast tego zadeklaruj je w konstruktorze.

class Foo { 
    constructor() { 
    this.f1 = undefined; 
    } 
} 

Następnie można uzyskać je za pomocą Object.keys.

Korzystanie z funkcji eksperymentalnych w Babelu pozwala zadeklarować właściwości za pomocą tej składni, ale ich wartości muszą zostać zadeklarowane.

class Foo { 
    f1 = 0; 
    ... 
} 

chodzi o dostępie do pobierające, getters są dla przeliczalny domyślnie i nie można uzyskać za pomocą Object.keys ani żadnego podobnego mechanizmu. Można jednak utworzyć wyliczalne pobierające przy użyciu Object.defineProperty.

Object.defineProperty(bar, 'f2', { 
    get() { 
    return "a"; 
    } 
}); 

Jeśli używasz eksperymentalne funkcje ES7 można zastosować decorator do metody klasy i uzyskać takie samo zachowanie. Zobacz ten Babel sample.

class Foo { 
    @enumerable() 
    get b2() { 
    return "a"; 
    } 
} 

function enumerable() { 
    return function(target, key, descriptor) { 
    if (descriptor) { 
     descriptor.enumerable = true; 
    } 
    } 
} 
+0

1 - Używam tej funkcji eksperymentalnej, którą obsługuje babel (dla 'f1' i' b1'). 2 - 'Object.keys()' nie daje mi 'b2' i' f2'. – Sylvain

+0

@Sylvain Babel może to zaakceptować, ale jeśli spojrzysz na skompilowany kod, 'f1' i' b1' nie zostaną zadeklarowane. Babel zadeklaruje je, jeśli przypiszesz im wartości takie jak "f1 = 0". Jeśli chodzi o 'f2' i' b2', [ściągacze nie są domyślnie wyliczane] (http://stackoverflow.com/questions/34517538/setting-an-es6-class-getter-to-enumerable). –

+0

dobry punkt. 1 - Mogę to naprawić (i pozostawić go poza konstruktorem), jeśli ustawię je tam na niezdefiniowane. 2 - Czy istnieje funkcja, która dostarczy mi listę tych pobierających lub czy są naprawdę ukryte? – Sylvain

0

Wydaje mi się, że odpowiedź na to pytanie była wcześniej. Można zastosować Object.getOwnPropertyNames do instancji i jego prototypów:

function getAllPropertyNames(obj) { 
    let names = []; 
    do { 
    names.push.apply(names, Object.getOwnPropertyNames(obj)); 
    obj = Object.getPrototypeOf(obj); 
    } while(obj !== Object.prototype); 
    return names.filter(name => name !== 'constructor'); 
} 
Powiązane problemy