JavaScript:如何在父构造函数中获取子类的方法?

时间:2017-02-05 18:36:35

标签: javascript class inheritance constructor

如何在console.log类的构造函数中获取(B for ex。)A类的方法?

class A {
    constructor() {
        // GET B's method names ('ok', ...) here
    }
}

class B extends A {
    constructor() {
        super();
    }

    ok() {

    }
}

2 个答案:

答案 0 :(得分:1)

使用new.target.prototypeObject.getPrototypeOf(this)来获取实例化子类的原型对象。然后traverse the prototype chain到所有超类,并获得每个对象的自己的属性。不要忘记不可枚举的财产。

当然,在构造函数中使用它不仅仅是为了记录/调试目的,这是代码味道。类不应该知道它的子类。如果要进行自动绑定,请让每个子类构造函数自动绑定自己的方法。

答案 1 :(得分:1)

在"基地"构造函数,您可以访问完整的对象,因此可以检查它的真正构造函数是什么,因此它的原型const childClassPrototype = this.constructor.prototype。有一个孩子"原型,您可以使用Object.getOwnPropertyNames(childClassPrototype)获取其属性列表。从该列表中您想要过滤掉#34;构造函数"以及不是函数的属性。

注意:此技术只允许您访问" leaf"原型,一旦你有一个多级原型链。因此,您必须遍历原型链。

注2:对于自动绑定,您可能会考虑使用装饰器。这里有一个实现:https://github.com/andreypopp/autobind-decorator - 这种技术可以让你更好地控制可能来自元编程的意外行为