2016-01-07 5 views
5

dato queste due classiCome iterare su proprietà di un ES6/2015 istanza di classe

class Foo{ 
    f1; 

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

class Bar extends Foo { 
    b1; 

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

let bar = new Bar(); 

Quale codice mi sarà possibile ottenere questo elenco di oggetti di dell'istanza bar? ['f1', 'f2', 'b1', 'b2']

Here is a Babel sample


Aggiornamento

Questo dovrebbe essere parte della risposta di @ Marc C:

Utilizzando un decoratore posso facilmente trasformare una struttura non enumerabile in una proprietà enumerabili:

class Bar extends Foo { 

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

} 

Qui è la fonte decoratore:

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

Here is a Babel sample

+0

Sembra che questa onestamente come un duplicato di http://stackoverflow.com/questions/31054910/get-functions-of-a-class. Non c'è motivo di rendere le proprietà enumerabili. – loganfsmyth

+1

[tag: babele]: * "Libreria di internazionalizzazione Python con particolare attenzione alle applicazioni basate sul Web. Per domande sulla libreria JavaScript, utilizzare [babeljs]." * –

risposta

5

Questo non valid syntax for declaring properties in una classe. Invece, dichiarali nel costruttore.

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

Quindi è possibile ottenerli utilizzando Object.keys.

L'utilizzo di funzionalità sperimentali in Babel consente di dichiarare le proprietà utilizzando tale sintassi ma i relativi valori devono essere dichiarati.

class Foo { 
    f1 = 0; 
    ... 
} 

quanto per accedere ai getter, getter sono non enumerable di default e non può accedere usando Object.keys o qualsiasi meccanismo simile. Tuttavia, è possibile creare getter enumerabili utilizzando Object.defineProperty.

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

Se stai usando funzioni sperimentali ES7, è possibile applicare un decorator al metodo di classe e ottenere lo stesso comportamento. Vedi questo Babel sample.

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

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

1 - Uso questa funzione sperimentale che Babel supporta (per 'f1' e' b1'). 2 - 'Object.keys()' non mi ottiene 'b2' e' f2'. – Sylvain

+0

@Sylvain Babel può accettarlo ma se si guarda il codice compilato, 'f1' e' b1' non sono dichiarati. Babel li dichiarerà se gli assegni valori come 'f1 = 0'. Per quanto riguarda 'f2' e' b2', [i getters non sono enumerabili per impostazione predefinita] (http://stackoverflow.com/questions/34517538/setting-an-es6-class-getter-to-enumerable). –

+0

buon punto. 1 - Posso sistemarlo (e lasciarlo fuori da un costruttore) se li ho impostati su undefined lassù. 2 - C'è una funzione che mi fornirà la lista di questi getter o sono veramente nascosti? – Sylvain

0

Mi sento come se ci fosse una risposta prima. È possibile applicare Object.getOwnPropertyNames all'istanza e dei suoi prototipi:

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'); 
} 
Problemi correlati