Получить все статические геттеры в классе

Допустим, у меня есть этот класс (который я использую как перечисление):

class Color {
    static get Red() {
        return 0;
    }
    static get Black() {
        return 1;
    }
}

Есть ли что-нибудь похожее на Object.keys для получения ['Red', 'Black']?

Я использую Node.js v6.5.0, что означает, что некоторые функции могут отсутствовать.


person Almis    schedule 03.09.2016    source источник
comment
@Gothdo: Object.keys также не фильтрует геттеры, поэтому я предположил, что ОП будет знать, как проверить, является ли это геттером, свойством данных, методом или чем-то еще.   -  person Bergi    schedule 03.09.2016
comment
@Bergi Я не знаком с геттерами JS, я привел Object.keys в качестве примера, потому что это самое близкое, что пришло мне в голову.   -  person Almis    schedule 03.09.2016


Ответы (1)


Используйте Object.getOwnPropertyDescriptors() и отфильтруйте результаты по содержат только свойства, которые имеют геттеры:

class Color {
    static get Red() {
        return 0;
    }
    static get Black() {
        return 1;
    }
}

const getters = Object.entries(Object.getOwnPropertyDescriptors(Color))
  .filter(([key, descriptor]) => typeof descriptor.get === 'function')
  .map(([key]) => key)

console.log(getters)

Вы также можете попробовать этот подход, он должен работать в Node.js 6.5.0.

class Color {
    static get Red() {
        return 0;
    }
    static get Black() {
        return 1;
    }
}

const getters = Object.getOwnPropertyNames(Color)
  .map(key => [key, Object.getOwnPropertyDescriptor(Color, key)])
  .filter(([key, descriptor]) => typeof descriptor.get === 'function')
  .map(([key]) => key)

console.log(getters)

person Michał Perłakowski    schedule 03.09.2016
comment
Просто напомню, что это также допустимый метод для получения не-статических геттеров, нужно просто искать в Color.prototype вместо Color. - person Ilya Semenov; 15.10.2020