2016-11-24 6 views
1

Ich habe eine Base Klasse alses6 erstrecken sich bereits definierte Klasse

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

und eine Target Klasse als

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

Ich möchte Target verlängern machen Base nach seiner definiert. Ich meine, ich weiß, ich könnte einfach die folgenden Schritte aus

class Target extends Base { ... } 

Allerdings habe ich immer noch in der Lage sein zu verlängern Target mit Base nach seiner definiert.

Ich versuchte mehrere Möglichkeiten, aber nicht ganz zufrieden damit. Ist das möglich?

Ich könnte class Base extends Target {} tun, aber dann ist es nicht mehr die gleiche Klasse.

Mein grundlegendes Ziel ist; Ich möchte constructor zu einer Klasse hinzufügen (die ich weiß, dass ich nicht kann), also einige Wege herausfinden.

+2

Warum brauchen Sie das? – zerkms

+0

Lol, gute Frage ... Ich weiß nicht wirklich ...: P Ok, ich werde erklären, ich möchte viele Klassen mit einigen Methoden definieren, jedes Ergebnis einer Berechnung zurückgeben. Die Daten (auf denen diese Formeln angewendet werden) werden im Konstruktor übergeben (wo ich sie vorverarbeiten möchte) ... Also möchte ich Formel-Klassen mit nur Formel-Methoden sauber halten und alles andere in meinem Decorator machen Funktion oder Basisklasse ... Macht Sinn? –

+1

Ihr Kommentar erklärt nicht, warum Sie den Prototyp dynamisch ändern möchten. Es erklärt nicht einmal, warum Sie Vererbung brauchen. – zeroflagL

Antwort

1

Sie können eine vorhandene Klasse von einer anderen Klasse "erben", indem Sie den Prototyp des Prototyps der Kindklasse festlegen. Klingt ein wenig kompliziert, so ist hier alles was man braucht:

class Base {} 
class Child {} 

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

Allerdings gibt es ein gotcha: Die Child ‚s Implementierung entworfen wurde nicht von einer anderen Klasse zu erben - wenn zum Beispiel wird der Base Konstruktor einige tun wichtige Arbeit (oft Eltern Konstruktoren einige Initialisierungsschritte) dies wird nicht genannt werden, was bedeutet, Sie können alle Arten von Bugs auftreten.

In dem Kontext, den Sie beschreiben, gibt es keine praktikable Lösung zum programmatischen Erweitern einer Klasse und sicherstellen, dass der Konstruktor der übergeordneten Klasse aufgerufen wird. Dies liegt daran, dass es keine Möglichkeit gibt, die Konstruktorfunktion der Kindklasse zu "patchen", um den Konstruktor der Elternklasse tatsächlich aufzurufen.

Sie könnten versucht sein, die Child.prototype.constructor Eigenschaft außer Kraft zu setzen und dort flicken, aber das Problem ist, dass das ist nicht das, was wird aufgerufen, wenn Sie new Child() tun, dann ist es die Child Funktion selbst - der Konstruktor Eigenschaft spielt keine Rolle in diesem Prozess.

+0

Nein, wird nicht funktionieren ... Ich habe in dem Kommentar oben erklärt. –

+0

Aktualisiert basierend auf Ihren Updates. Leider sehe ich keinen Weg, dies zu erreichen. Es tut uns leid. –

+0

Traurig ... Danke trotzdem. –