Heutzutage sind alle Frameworks modular, und selbst Front-End-JavaScript ist keine Ausnahme. Jedes Modul ist für bestimmte Funktionen verantwortlich, und es besteht eine gegenseitige Abhängigkeit zwischen Modulen. Die Frage ist also: Wie kann die Abhängigkeitsinjektion in JavaScript implementiert werden? (JavaScripts Abhängigkeitsinjektion, wichtige Rahmenbedingungen haben entsprechende Implementierungen, hier werden nur Implementierungsideen erlernt.)
Die folgenden Anforderungen:
Angenommen, es gibt bereits ein definiertes Servicemodul-Schlüsselwert, Func ist der hinzugefügte neue Service und die Parameterliste ist die Serviceabhängigkeit.
Die Codekopie lautet wie folgt:
var services = {abc: 123, def: 456, ghi: 789}; // Angenommen, einige Dienste sind definiert
Funktionsdienst (ABC, GHI) {
this.write = function () {
console.log (ABC);
console.log (ghi);
}
}
Funktion activitor (func) {
var obj;
// erreichen
Rückkehr obj;
}
Lösung:
Nehmen Sie durch einen Mechanismus (Reflexion?) Die vom Func definierte Parameterliste und weisen Sie die Werte nacheinander zu. Dann ist der Funktion durch einen Mechanismus (Activitor?) Sofortwesen.
Lösung:
1. Holen Sie sich die Parameterliste von Func:
Wie bekomme ich die Parameterliste? Das erste, was mir in den Sinn kommt, ist der Reflexionsmechanismus. Gibt es also eine Reflexion in JavaScript? Es sollte da sein. Ich weiß gerade nur, wie man die EV -Funktion (STR) -Funktion verwendet, aber es scheint, dass es keine relevante Implementierung zum Erhalten der Parameterliste gibt. Schauen wir uns die Definition func.argumente an. Diese Eigenschaft ist nur gültig, wenn sie Func anrufen und Parameter übergeben, und kann die Anforderungen nicht erfüllen.
Können wir also die Parameterliste erhalten, indem wir die Zeichenfolge nach func.toString () verarbeiten?
Versuchen wir es:
Die Codekopie lautet wie folgt:
Funktion getFuncParams (func) {
var Matches = func.toString (). Übereinstimmung (/^function/s*[^/(]*/(/s*([^/)]*)/)/m);
if (übereinstimmt && mines.length> 1)
Rückgabeübereinstimmungen [1] .Replace (// s*/, '') .Split (',');
zurückkehren [];
};
Hier erhalten wir das Func -Parameterlisten -Array.
2. Finden Sie Abhängigkeiten basierend auf der Parameterliste:
Nach dem Erhalt der Parameterliste wird die Abhängigkeitsliste erhalten. Es ist sehr einfach, die Abhängigkeit als Parameter in sie zu übergeben.
Die Codekopie lautet wie folgt:
var params = getFuncParams (func);
für (var i in params) {
Params [i] = Dienste [Params [i]];
}
3. Übergeben Sie die Abhängigkeitsparameter und instanziieren Sie sie:
Wir wissen, dass JavaScript func.Constructor hat, das zwei Funktionen hat: call (thisArg, [arg [, arg, [arg, […]]]) und anwenden (thisArg, args…) und Instanziierungsfunktionen implementieren können. Der erste Parameter der Anruffunktion ist dieser Zeiger, und der Rest ist eine Parameterliste. Dies ist für die Verwendung geeignet, wenn eine Func -Parameterliste bekannt ist und meine Anforderungen nicht erfüllen kann. Schauen wir uns die zweite Anwendung an. Der erste Parameter ist auch dieser Zeiger, und der zweite Parameter ist ein Parameterarray. Wenn es aufgerufen wird, werden die Func -Parameterliste nacheinander automatisch Werte zugewiesen, was nur meinen Anforderungen entspricht.
Der Code ist ungefähr wie folgt:
Die Codekopie lautet wie folgt:
Funktion activitor (func) {
var obj = {};
func.apply (obj, params);
Rückkehr obj;
}
Zu diesem Zeitpunkt können wir eine Instanz dieses Func erstellen und die von diesem Funktion geforderten Parameter übergeben.
4. Drucken und testen Sie es:
Vollständiger Code:
Die Codekopie lautet wie folgt:
var
// Angenommen, einige Dienste sind definiert
services = {abc: 123, def: 456, ghi: 789},
// Erhalten Sie die Parameterliste von Func (Abhängigkeitsliste)
getfuncParams = function (func) {
var Matches = func.toString (). Übereinstimmung (/^function/s*[^/(]*/(/s*([^/)]*)/)/m);
if (übereinstimmt && mines.length> 1)
Rückgabeübereinstimmungen [1] .Replace (// s+/, '') .Split (',');
zurückkehren [];
},
// Parameter (Abhängigkeiten) gemäß Parameterliste (Abhängigkeiten) füllen (Abhängigkeiten)
setfuncparams = function (params) {
für (var i in params) {
Params [i] = Dienste [Params [i]];
}
Rückgabeparameter;
};
// Aktivator
Funktion activitor (func) {
var obj = {};
func.apply (obj, setfuncParams (getFuncParams (func)));
Rückkehr obj;
}
// einen neuen Service definieren
Funktionsdienst (ABC, GHI) {
this.write = function () {
console.log (ABC);
console.log (ghi);
}
}
// den Dienst instanziieren und die Methode rufen
var service = activeator (Service);
service.write ();
Die Konsole wurde erfolgreich gedruckt!