Получение списка статики в классе ES6

Учитывая класс ES6, как я могу проверить его, чтобы определить его доступные статические свойства и методы?

В ES5 определение статики, прикрепленной к классу (его конструктору), было таким же простым, как итерация по свойствам функции. В ES6, похоже, происходит какое-то волшебство, которое не раскрывает их как таковые.


person Allain Lalonde    schedule 11.10.2015    source источник


Ответы (2)


Да, все методы classes по умолчанию не являются перечисляемыми.

Вы по-прежнему можете повторять их, используя Object.getOwnPropertyNames. . Отфильтруйте .prototype, .name и .length (или просто все, что не является функцией). Чтобы включить унаследованные статические методы, вам придется явно пройти по цепочке прототипов (используя Object.getPrototypeOf).

person Bergi    schedule 11.10.2015

Если вы хотите получить динамический список имен свойств стандартного класса (чтобы вы могли отфильтровать их из списка статических членов), вы можете просто получить имена свойств из пустого класса:

const standardClassProps = Object.getOwnPropertyNames(class _{});

// ["length", "prototype", "name"]

Это создаст достаточно перспективный массив, который будет динамически адаптироваться к изменениям стандарта, особенно к добавлению новых стандартных статических свойств.

class Foo {
    static bar() {}
}

function isOwnStaticMember(propName) {
    return !standardClassProps.includes(propName);
}

const staticMembers = Object.getOwnPropertyNames( Foo ).filter(isOwnStaticMember);

// ["bar"]
person JDB still remembers Monica    schedule 12.02.2020