如何在console.log
类的构造函数中获取(B
for ex。)A
类的方法?
class A {
constructor() {
// GET B's method names ('ok', ...) here
}
}
class B extends A {
constructor() {
super();
}
ok() {
}
}
答案 0 :(得分:1)
使用new.target.prototype
或Object.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 - 这种技术可以让你更好地控制可能来自元编程的意外行为