Lassen Sie mich damit beginnen, dass dies eher eine Frage der Neugier ist, denn, wie Sie sehen werden, war ich in der Lage, die gewünschte Funktionalität zu erreichen.
Angesichts der Tatsache, dass Javascript eine super flexible Sprache ist, würde Ich mag, was andere Entwickler sehen könnte über dieses Problem denken:Javascript - dekoriere eine Klasseninstanz, ohne explizit alle Funktionen weiterzugeben
ich eine Instanz einer Klasse, die von einem Lieferanten Funktion zurückgegeben wird:
const connection = vendorDatabaseLib.createConnection();
Jetzt möchte ich einen Dekorator erstellen, der der Verbindungsklasse Funktionalität hinzufügt, z. B. Reconnection-Logik.
Lässt es PersistentConnection
anrufen. Abgesehen von meinen zusätzlichen benutzerdefinierten Funktionen möchte ich eine Instanz von PersistentConnection
, um alle Funktionsaufrufe an die ursprüngliche Connection
Instanz weiterzuleiten. Und überschreiben Sie in einigen Funktionen das Verhalten.
Ich könnte natürlich alle Funktionen Connection
explizit implementieren und sie an das innere Objekt weiterleiten, aber es könnte viele dieser Funktionen geben, so dass ich diese Idee schnell verworfen habe.
So sind hier meine Ideen, wie diese zu erreichen:
- Affen Patchen, statt Dekorateur kann ich eine
PersistentConnection
Klasse erstellen, die von dem Anbieter erbtConnection
und dann den VerkäufervendorDatabaseLib.createConnection
Funktion PatchPersistentConnection
zurückzukehren mit all meinen gewünschten zusätzlichen Funktionen. Verlockend, aber schlecht. - einen Dekorateur erstellen, die iteriert über die
Connection
Funktionen und wie vorwärts dynamisch, etwas schafft:
class PersistentConnection{
constructor(connection){
this._connection = connection;
// Iterate through all functions
for (prop in this._connection){
if(typeof(this._connection[prop]) === 'function'){
// Create functions dynamically for each forward
this[prop] = (...args) => {
this._connection[prop](...args);
}
}
}
}
// This is the added logic
reconnect(){
// Custom logic
}
}
- Stellen Sie die
Connection
Instanz ein Prototyp derPersistentConnection
's Instanz sein:
function persistenChannel(channel){
const persistentChannel = {};
Object.setPrototypeOf(persistentChannel, channel);
persistentChannel.reconnect =() => {
// custom logic
}
}
Dies ist der „Automatik“ Weg, ich .. denken konnte Aber es gerade nach unten rechts hässlich, und die benutzerdefinierten Funktionen müssen jedes Mal eine Instanz erstellt wird, erklärt werden.
Ich fühle mich immer noch, wie ich etwas, so etwas wie Rubys magische method_missing
(oder Pythons __getattr__
) Funktion bin fehlt, die kurz vor einer method is missing
Ausnahme ausgelöst genannt wird, und lässt Sie „Sicherheitsnetz“ Logik definieren (wie alle Anrufe zu delegieren zu die innere _connection
Objekt.
gibt es einen besseren Weg, um diese Funktionalität zu erreichen? vielen Dank [=
Schön! Proxy ist das fehlende Link, nach dem ich gesucht habe! –
@PavelTarno Fühlen Sie sich frei, als Antwort zu markieren, wenn es eine Antwort ist :) – Vitalii