获取ES6类的静态列表

All*_*nde 4 javascript properties class ecmascript-6 es6-class

给定ES6类,我如何检查它以确定其可获取的静态属性和方法?

在ES5中,确定附加到类(它的构造函数)的静态就像迭代函数的属性一样简单.在ES6中,似乎有一些不会暴露它们的魔法.

Ber*_*rgi 9

是的,class默认情况下,es的所有方法都是不可枚举的.

您仍然可以使用它们进行迭代Object.getOwnPropertyNames.过滤掉.prototype,.name.length(这不是一个函数或只是一切).要包含继承的静态方法,您必须显式地(使用Object.getPrototypeOf)遍历原型链.


JDB*_*JDB 5

如果您想获取标准类属性名称的动态列表(以便可以将它们从静态成员列表中过滤出来),您可以简单地从空类中获取属性名称:

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

// ["length", "prototype", "name"]
Run Code Online (Sandbox Code Playgroud)

这将产生一个合理的面向未来的数组,它将动态适应标准的变化,特别是新标准静态属性的添加。

class Foo {
    static bar() {}
}

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

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

// ["bar"]
Run Code Online (Sandbox Code Playgroud)