如何拆卸ES6类?

时间:2015-10-26 11:49:57

标签: javascript ecmascript-6

如何将ES6课程分解为个别功能?

class ParentClass {
}
class MyClass extends ParentClass {
    static get STATIC_GETTER() {
    }
    static set STATIC_SETTER(value) {
    }
    static STATIC_METHOD() {
    }
    get GETTER() {
    }
    set SETTER(value) {
    }
    METHOD1() {
    }
    METHOD2() {
    }
    constructor() {
    }
}

我想在控制台上打印如下内容:

The class "MyClass"
extends class: ParentClass
has:
a constructor
static getters: STATIC_GETTER
static setters: STATIC_SETTER
static method: STATIC_METHOD
getters: GETTER
setters: SETTER
methods: METHOD1,METHOD2

1 个答案:

答案 0 :(得分:1)

与ES5不同,ES6课程是标准化的。以及原型联动。

在ES6中,实际上有两个原型链,与ES5不同。

  • Child-> Parent .prototype 链接。 (用于对象实例。)
  • Child-> Parent .constructor 链接。 (用于类静态属性。)

为了在ES6中全部检索它们,建议使用全局Reflect JS API。

以下是检索类的所有实例方法/属性以及其所有父级的方法。

function classMethods(ctor) {
  if (ctor === Function.prototype) return {};
  return Reflect.ownKeys(ctor.prototype).reduce((methods, k) => {
    if (k !== 'constructor') {
      methods[k] = ctor.prototype[k];
    }
    return methods;
  }, classMethods(ctor.__proto__))
}

要检索遍历构造函数本身所需的所有静态方法/属性。

function classStaticProperties(ctor) {
  if (ctor === Function.prototype) return {};
  return Reflect.ownKeys(ctor).reduce((statics, k) => {
    if (k !== 'length' && k !== 'name' && k !== 'prototype') {
      statics[k] = ctor[k];
    }
    return statics;
  }, classStaticProperties(ctor.__proto__));
}

用法:

const allMethods = classMethods(MyChildClass);
const allStaticProperties = classStaticProperties(MyChildClass);