Hoy en día, todos los marcos son modulares, e incluso JavaScript front-end no es una excepción. Cada módulo es responsable de ciertas funciones, y existe la interdependencia entre los módulos. Entonces, la pregunta es: ¿cómo implementar la inyección de dependencia en JavaScript? (Inyección de dependencia de JavaScript, los marcos principales tienen implementaciones correspondientes, solo se aprenden las ideas de implementación aquí)
Los siguientes requisitos:
Suponga que ya existe una colección de clave de valor de módulo de servicio definida, FUNC es el nuevo servicio agregado y la lista de parámetros es la dependencia del servicio.
La copia del código es la siguiente:
VAR Services = {ABC: 123, def: 456, GHI: 789}; // Suponga que algunos servicios están definidos
Servicio de funciones (ABC, GHI) {
this.write = function () {
console.log (ABC);
console.log (GHI);
}
}
Función Activitor (func) {
var obj;
// lograr
regresar obj;
}
Solución:
A través de algún mecanismo (¿reflexión?), Saque la lista de parámetros definida por el func y asigne valores uno por uno. Luego, a través de algún mecanismo (¿Activitor?), El FUNC está instanciado.
Solución:
1. Obtenga la lista de parámetros de func:
¿Cómo obtener la lista de parámetros? Lo primero que viene a la mente es el mecanismo de reflexión. Entonces, ¿hay alguna reflexión en JavaScript? Debería estar ahí. Solo sé cómo usar la función eval (STR) en este momento, pero parece que no hay una implementación relevante para obtener la lista de parámetros. Veamos la definición de los argumentos de FURC. Esta propiedad solo es válida al llamar a FUNC y pasar parámetros, y no puede satisfacer las necesidades.
Entonces, ¿podemos obtener la lista de parámetros procesando la cadena después de FURC.ToString ()?
Vamos a intentarlo:
La copia del código es la siguiente:
función getFuncparams (func) {
var coincides = func.ToString (). Match (/^function/s*[^/(]*/(/s*([^/)]*)/)/m);
if (partidos && coincidentes.length> 1)
Matajes de retorno [1] .replace (// s*/, '') .split (',');
devolver [];
};
Aquí obtenemos la matriz de la lista de parámetros FUNC.
2. Encuentre dependencias basadas en la lista de parámetros:
Después de obtener la lista de parámetros, es decir, se obtiene la lista de dependencia. Es muy simple pasar la dependencia como parámetro.
La copia del código es la siguiente:
var params = getFuncparams (func);
para (var i en params) {
params [i] = servicios [params [i]];
}
3. Pase los parámetros de dependencia y instancíelos:
Sabemos que JavaScript tiene FURC.Constructor, que tiene dos funciones: Llame (ThatErg, [Arg [, Arg, [Arg, [...]]])) y aplique (Thisarg, Args ...) y puede implementar operaciones de FUNC de instanciación. El primer parámetro de la función de llamada es este puntero, y el resto es una lista de parámetros. Esto es adecuado para su uso cuando se conoce una lista de parámetros FUNC y no puede satisfacer mis necesidades. Veamos la segunda función de aplicación. El primer parámetro también es este puntero, y el segundo parámetro es una matriz de parámetros. Cuando se le llame, asignará automáticamente valores a la lista de parámetros FUNC uno por uno, que simplemente satisface mis necesidades.
El código es más o menos como sigue:
La copia del código es la siguiente:
Función Activitor (func) {
var obj = {};
FunC.Apply (obj, params);
regresar obj;
}
En este punto, podemos crear una instancia de este func y pasar los parámetros requeridos por este func.
4. Imprima y pruebalo:
Código completo:
La copia del código es la siguiente:
varilla
// Suponga que algunos servicios están definidos
servicios = {ABC: 123, def: 456, GHI: 789},
// Obtenga la lista de parámetros de func (lista de dependencias)
getFuncparams = function (func) {
var coincides = func.ToString (). Match (/^function/s*[^/(]*/(/s*([^/)]*)/)/m);
if (partidos && coincidentes.length> 1)
Matajes de retorno [1] .replace (// s+/, '') .split (',');
devolver [];
},
// Llenar los parámetros (dependencias) de acuerdo con la lista de parámetros (dependencias)
setFuncparams = function (params) {
para (var i en params) {
params [i] = servicios [params [i]];
}
devolver los parámetros;
};
// activador
Función Activitor (func) {
var obj = {};
FunC.Apply (OBJ, SetFuncParams (getFuncParams (func)));
regresar obj;
}
// Defina un nuevo servicio
Servicio de funciones (ABC, GHI) {
this.write = function () {
console.log (ABC);
console.log (GHI);
}
}
// instanciar el servicio y llamar al método
servicio var = activador (servicio);
servicio.write ();
¡La consola se imprimió con éxito!