【问题标题】:JavaScript: How to get child Class's methods in parent's constructor?JavaScript:如何在父类的构造函数中获取子类的方法?
【发布时间】:2017-02-05 18:36:34
【问题描述】:

如何在A类的构造函数中获取(例如console.logB类的方法?

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

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

    ok() {

    }
}

【问题讨论】:

  • 听起来代码味道很重
  • 有什么好处,有什么意义?
  • @RomanPerekhrest 只是想知道我是否可以进行自动绑定;)

标签: javascript class inheritance constructor


【解决方案1】:

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

注意:一旦您可能拥有多级原型链,此技术只会让您访问“叶”原型。因此,您必须迭代原型链。

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

【讨论】:

  • 谢谢。这效果更好:)
【解决方案2】:

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

当然,在构造函数中使用 this 不仅仅是为了记录/调试目的是一种代码味道。一个类不需要知道它的子类。如果你想做自动绑定,让每个子类构造函数自动绑定自己的方法。

【讨论】:

    猜你喜欢
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    相关资源
    最近更新 更多