获取 ES6 上的静态列表 class
Getting a list of statics on an ES6 class
给定一个 ES6 class,我如何检查它以确定其可获取的静态属性和方法?
在 ES5 中,确定附加到 class(它的构造函数)的静态信息就像迭代函数的属性一样简单。在 ES6 中,似乎有一些魔法不会暴露它们。
是的,class
es的所有方法默认都是不可枚举的。
您仍然可以使用 Object.getOwnPropertyNames
迭代它们。过滤掉 .prototype
、.name
和 .length
(或者过滤掉所有不是函数的东西)。要包含继承的静态方法,您必须显式遍历原型链(使用 Object.getPrototypeOf
)。
如果您想获取标准 class 属性 名称的动态列表(以便您可以将它们从静态成员列表中过滤掉),您可以简单地获取 属性 空的名字 class:
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"]
给定一个 ES6 class,我如何检查它以确定其可获取的静态属性和方法?
在 ES5 中,确定附加到 class(它的构造函数)的静态信息就像迭代函数的属性一样简单。在 ES6 中,似乎有一些魔法不会暴露它们。
是的,class
es的所有方法默认都是不可枚举的。
您仍然可以使用 Object.getOwnPropertyNames
迭代它们。过滤掉 .prototype
、.name
和 .length
(或者过滤掉所有不是函数的东西)。要包含继承的静态方法,您必须显式遍历原型链(使用 Object.getPrototypeOf
)。
如果您想获取标准 class 属性 名称的动态列表(以便您可以将它们从静态成员列表中过滤掉),您可以简单地获取 属性 空的名字 class:
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"]