2016-11-24 4 views
1

У меня есть Base класс какES6 расширить уже определен класс

class Base { 
    constructor() { 
     console.log('should get called') 
    } 
} 

и Target класс как

class Target { 
    someFn() { 
     // does something 
    } 
} 

Я хочу сделать Target продлить Base после его определить. Я имею в виду, я знаю, что я мог бы просто сделать следующее

class Target extends Base { ... } 

Однако, я все еще хочу, чтобы иметь возможность расширить Target с Base после его определены.

Я пробовал несколько способов, но не вполне доволен этим. Это возможно?

Я мог бы сделать class Base extends Target {}, но тогда его уже не такой класс.

Моя основная цель; Я хочу добавить constructor в класс (который, как я знаю, я не могу), поэтому выясню некоторые способы.

+2

Зачем вам это нужно? – zerkms

+0

Lol, хороший вопрос ... Я не знаю, на самом деле ...: P Хорошо, я объясню, я хочу определить множество классов с помощью некоторых методов, каждый из которых возвращает результат некоторых вычислений. Данные (по которым эти формулы будут работать) будут переданы в конструкторе (где я хочу его предварительно обработать) ... Поэтому я хочу, чтобы классы классов были чистыми только с помощью методов формулы и делали все остальное в моем декораторе функции или базового класса ... Имеет смысл? –

+1

Ваш комментарий не объясняет, почему вы хотите динамически менять прототип. Это даже не объясняет, почему вам нужно наследование. – zeroflagL

ответ

1

Вы можете сделать существующий класс «наследовать» из другого класса, установив прототип прототипа дочернего класса. Звучит немного сложно, так что здесь все, что нужно:

class Base {} 
class Child {} 

Object.setPrototypeOf(Child.prototype, Base.prototype) 

Однако есть глюк: Реализация Child «s не была разработана, чтобы наследовать от другого класса - если, например, Base конструктор делают некоторые важная работа (много раз, когда родительские конструкторы выполняют некоторые шаги инициализации) это не будет называться, то есть вы можете встретить всевозможные ошибки.

В контексте, который вы описываете, нет жизнеспособного решения программно расширить класс и, чтобы обеспечить, чтобы конструктор родительского класса вызывался. Это связано с тем, что нет возможности «запланировать» функцию конструктора дочернего класса для фактического вызова конструктора родительского класса.

Вы можете захотеть переопределить Child.prototype.constructor свойства и пропатчить его там, но проблема в том, что это не то, что называется, когда вы делаете new Child(), это сама Child функции - свойство конструктора не играют роли в этом процессе.

+0

Нет, не сработает ... Я объяснил в комментарии выше. –

+0

Обновлено на основе ваших обновлений. К сожалению, я не вижу способа сделать эту работу. Сожалею. –

+0

Печально ... Спасибо в любом случае. –