给定一个ES6类,我该如何检查它以确定其可获取的静态属性和方法?
在ES5中,确定附加到类(即构造函数)的静态内容很简单,只需要迭代函数的属性即可。在ES6中,似乎有一些不为人知的魔法,没有将它们公开。
给定一个ES6类,我该如何检查它以确定其可获取的静态属性和方法?
在ES5中,确定附加到类(即构造函数)的静态内容很简单,只需要迭代函数的属性即可。在ES6中,似乎有一些不为人知的魔法,没有将它们公开。
是的,默认情况下,所有class
的方法都是不可枚举的。
然而,您仍然可以使用Object.getOwnPropertyNames
来迭代它们。过滤掉.prototype
、.name
和.length
(或者过滤掉所有非函数的内容)。如果要包含继承的静态方法,则必须显式地遍历原型链(使用Object.getPrototypeOf
)。
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"]