2017-02-05 3 views
0

Как получить (console.log для примера) B методы класса в A конструктор класса?JavaScript: Как получить методы дочернего класса в конструкторе родителя?

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

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

    ok() { 

    } 
} 
+0

Звучит как большой запах кода – haim770

+0

Какая польза и какой смысл? – RomanPerekhrest

+0

@RomanPrekhrest просто интересно, могу ли я сделать автосвязы;) –

ответ

0

В «базовом» конструкторе у вас есть доступ к полному объекту, поэтому вы можете проверить его реальный конструктор и его прототип const childClassPrototype = this.constructor.prototype. Имея «дочерний» прототип, вы можете получить список его свойств с помощью Object.getOwnPropertyNames(childClassPrototype). Из этого списка вы хотите отфильтровать «конструктор» и свойства, которые не являются функциями.

Примечание: этот метод даст вам доступ к прототипу «листа», как только у вас может быть цепочка прототипов нескольких уровней. Таким образом, вам нужно перебирать цепочку прототипов.

Примечание2: для автообнаружения вы можете рассмотреть возможность использования декоратора. Одна из реализаций приведена здесь: https://github.com/andreypopp/autobind-decorator - эта техника дает вам лучший контроль над неожиданным поведением, которое может возникать в результате метапрограммирования

+0

Спасибо. это работает лучше :) –

1

Используйте либо new.target.prototype или Object.getPrototypeOf(this), чтобы получить прототип объекта из реализованным подкласса. Затем traverse the prototype chain для всех суперклассов и получить собственные свойства каждого объекта. Не забудьте неперечислимые свойства.

Конечно, использование этого в конструкторе для более чем протоколирования/отладки - это запах кода. Класс не должен знать о своих подклассах. Если вы хотите сделать autobindings, пусть каждый конструктор подкласса autobind свои собственные методы.

+0

Спасибо, что помогает –

Смежные вопросы