2016-01-07 4 views
5

учитывая эти два классаКак перебрать свойства ES6/2015 экземпляра класса

class Foo{ 
    f1; 

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

class Bar extends Foo { 
    b1; 

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

let bar = new Bar(); 

Какой код будет получить мне этот список свойств из экземпляра bar? ['f1', 'f2', 'b1', 'b2']

Here is a Babel sample


Update

Это должно быть часть ответа @Marc языка C:

Использования декоратора я могу легко превратить ноны перечислимых имуществ в перечислимую собственность:

class Bar extends Foo { 

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

} 

Вот источник декоратор:

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

Here is a Babel sample

+0

Это честно кажется DUP из http://stackoverflow.com/questions/31054910/get-functions-of-a-class. Нет причин перечислить свойства. – loganfsmyth

+1

[tag: babel]: * «Библиотека интернационализации Python с акцентом на веб-приложениях. Для вопросов о библиотеке JavaScript используйте [babeljs].» * –

ответ

5

Это не valid syntax for declaring properties в классе. Вместо этого объявите их в конструкторе.

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

Тогда вы можете получить их, используя Object.keys.

Использование экспериментальных функций в Babel позволит вам объявлять свойства с использованием этого синтаксиса, но их значения должны быть объявлены.

class Foo { 
    f1 = 0; 
    ... 
} 

Что касается доступа к добытчикам, добытчики не являются перечислимы по умолчанию и не может быть доступны с помощью Object.keys или любого подобного механизма. Тем не менее, вы можете создавать перечислимые геттеры, используя Object.defineProperty.

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

Если вы используете экспериментальные функции ES7, вы можете применить decorator к методу класса и получить такое же поведение. См. Это Babel sample.

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

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

1 - Я использую эту экспериментальную функцию, поддерживаемую babel (для 'f1' и' b1'). 2 - 'Object.keys()' не получает меня 'b2' и' f2'. – Sylvain

+0

@ Sylvain Babel может принять его, но если вы посмотрите на скомпилированный код, 'f1' и' b1' не будут объявлены. Babel объявит их, если вы присвоите им такие значения, как 'f1 = 0'. Что касается 'f2' и' b2', [геттеры по умолчанию не перечислимы] (http://stackoverflow.com/questions/34517538/setting-an-es6-class-getter-to-enumerable). –

+0

хорошо пункт. 1 - Я могу исправить это (и оставить его вне конструктора), если я установил их в undefined там. 2 - Есть ли функция, которая даст мне список этих геттеров или они действительно скрыты? – Sylvain

0

Я чувствую, что раньше был дан ответ. Вы можете применить Object.getOwnPropertyNames к экземпляру и его прототипов:

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'); 
} 
Смежные вопросы