遍历 ES6 类的方法和属性

新手上路,请多包涵

因此,随着使用 JavaScript 的新框架的发展,许多人采用了 ECMAScript 6 shim 或 TypeScript,并具有许多新功能。我的问题是:

如何迭代 ES6 类的方法/属性?

例如(与对象)

 var obj = {
  prop: 'this is a property',
  something: 256,
  method: function() { console.log('you have invoked a method'); }
}

for (var key in obj) {
  console.log(key);
}

// => 'prop'
// => 'something'
// => 'method'

(有课)

 class MyClass {
  constructor() {
    this.prop = 'prop';
    this.something = 256;
  }

  method() {
    console.log('you have invoked a method');
  }
}

我如何列出方法 MyClass 以及可选的属性?

原文由 Aᴄʜᴇʀᴏɴғᴀɪʟ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 409
2 个回答

constructor 和任何定义的方法都是类的 prototype 对象的 不可枚举 属性。

因此,您可以获得名称数组(无需构造类的实例):

 Object.getOwnPropertyNames(MyClass.prototype)

您不能在不创建实例的情况下获取属性,但是这样做之后您可以使用 Object.keys 函数,该函数仅返回对象的可枚举属性:

 Object.keys(myInstance)

据我所知,没有标准的方法可以同时从原型和实例的可枚举属性中获取不可枚举的属性。

原文由 Alnitak 发布,翻译遵循 CC BY-SA 3.0 许可协议

的,这是可能的

我使用一个 util 函数,它可以:

  • 获取 未实例化 类的方法名称
  • 实例化
  • 递归获取 父类 的所有方法

像这样使用它:

 class A {
    fn1() { }
}

class B extends A {
    fn2() { }
}

const instanciatedB = new B();

console.log(getClassMethodNames(B)) // [ 'fn2' ]
console.log(getClassMethodNames(instanciatedB)) // [ 'fn2', 'fn1' ]

下面是 util 函数代码:

 function getClassMethodNames(klass) {
    const isGetter = (x, name) => (Object.getOwnPropertyDescriptor(x, name) || {}).get;
    const isFunction = (x, name) => typeof x[name] === 'function';
    const deepFunctions = x =>
        x !== Object.prototype &&
        Object.getOwnPropertyNames(x)
            .filter(name => isGetter(x, name) || isFunction(x, name))
            .concat(deepFunctions(Object.getPrototypeOf(x)) || []);
    const distinctDeepFunctions = klass => Array.from(new Set(deepFunctions(klass)));

    const allMethods = typeof klass.prototype === "undefined" ? distinctDeepFunctions(klass) : Object.getOwnPropertyNames(B.prototype);
    return allMethods.filter(name => name !== 'constructor' && !name.startsWith('__'))
}

原文由 TOPKAT 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏