De nos jours, tous les frameworks sont modulaires, et même JavaScript frontal ne fait pas exception. Chaque module est responsable de certaines fonctions et il existe une interdépendance entre les modules. La question est donc: comment implémenter l'injection de dépendance en JavaScript? (Injection de dépendance de JavaScript, les principaux cadres ont des implémentations correspondantes, seules les idées d'implémentation sont apprises ici)
Les exigences suivantes:
Supposons qu'il existe déjà une collection de valeurs clés du module de service défini, Func est le nouveau service ajouté et la liste des paramètres est la dépendance du service.
La copie de code est la suivante:
Var Services = {ABC: 123, Def: 456, Ghi: 789}; // Supposons que certains services sont définis
Service de fonction (ABC, GHI) {
this.write = function () {
Console.log (ABC);
Console.log (GHI);
}
}
fonction Activitor (func) {
var obj;
// accomplir
retour obj;
}
Solution:
Grâce à un mécanisme (réflexion?), Sortez la liste des paramètres définie par le func et attribuez des valeurs une par une. Ensuite, par un mécanisme (activateur?), Le func est instancié.
Solution:
1. Obtenez la liste des paramètres de Func:
Comment obtenir la liste des paramètres? La première chose qui me vient à l'esprit est le mécanisme de réflexion. Alors, y a-t-il une réflexion dans JavaScript? Il devrait être là. Je sais seulement utiliser la fonction EVAL (STR) pour le moment, mais il semble qu'il n'y ait pas d'implémentation pertinente pour obtenir la liste des paramètres. Examinons la définition Func. Arguments. Cette propriété n'est valable que lors de l'appel FUNC et de la réussite des paramètres, et ne peut pas répondre aux besoins.
Pouvons-nous donc obtenir la liste des paramètres en traitant la chaîne après func.ToString ()?
Essayons-le:
La copie de code est la suivante:
fonction getFuncParams (func) {
var correspond = func.ToString (). Match (/ ^ function / s * [^ / (] * / (/ s * ([^ /)] *) /) / m);
if (correspond && matches.length> 1)
retour de retour [1] .replace (// s * /, '') .split (',');
retour [];
};
Ici, nous obtenons le tableau de liste de paramètres FUNC.
2. Trouver les dépendances en fonction de la liste des paramètres:
Après avoir obtenu la liste des paramètres, c'est-à-dire que la liste de dépendances est obtenue. Il est très simple d'y passer la dépendance en tant que paramètre.
La copie de code est la suivante:
var params = getFuncParams (func);
pour (var i dans params) {
params [i] = services [params [i]];
}
3. Passez les paramètres de dépendance et instanciez-les:
Nous savons que JavaScript a func.Contructor, qui a deux fonctions: appel (thisarg, [arg [, arg, [arg, […]]]]) et s'appliquer (thisarg, args…) et peut mettre en œuvre des opérations de func d'instanciation. Le premier paramètre de la fonction d'appel est ce pointeur, et le reste est une liste de paramètres. Cela convient à une utilisation lorsqu'une liste de paramètres FUNC est connue et ne peut pas répondre à mes besoins. Examinons la deuxième fonction Appliquer. Le premier paramètre est également ce pointeur, et le deuxième paramètre est un tableau de paramètre. Lorsqu'il est appelé, il affectera automatiquement des valeurs à la liste des paramètres FUNC une par une, qui répond simplement à mes besoins.
Le code est à peu près comme suit:
La copie de code est la suivante:
fonction Activitor (func) {
var obj = {};
func.Apply (obj, params);
retour obj;
}
À ce stade, nous pouvons créer une instance de cette func et transmettre les paramètres requis par cette func.
4. Imprimez et testez-le:
Code complet:
La copie de code est la suivante:
var
// Supposons que certains services sont définis
services = {ABC: 123, Def: 456, Ghi: 789},
// Obtenez la liste des paramètres de la FUNC (liste de dépendances)
getFuncParams = fonction (func) {
var correspond = func.ToString (). Match (/ ^ function / s * [^ / (] * / (/ s * ([^ /)] *) /) / m);
if (correspond && matches.length> 1)
retour de retour [1] .replace (// s + /, '') .split (',');
retour [];
},
// Remplissez les paramètres (dépendances) en fonction de la liste des paramètres (dépendances)
setFuncParams = fonction (params) {
pour (var i dans params) {
params [i] = services [params [i]];
}
return params;
};
// Activateur
fonction Activitor (func) {
var obj = {};
func.Apply (obj, setfuncparams (getFuncParams (func)));
retour obj;
}
// définir un nouveau service
Service de fonction (ABC, GHI) {
this.write = function () {
Console.log (ABC);
Console.log (GHI);
}
}
// instancier le service et appeler la méthode
var service = activator (service);
Service.Write ();
La console a été imprimée avec succès!