Atualmente, todas as estruturas são modulares e até o JavaScript front-end não é exceção. Cada módulo é responsável por certas funções e há interdependência entre os módulos. Portanto, a pergunta é: como implementar a injeção de dependência em JavaScript? (Injeção de dependência do JavaScript, as principais estruturas têm implementações correspondentes, apenas as idéias de implementação são aprendidas aqui)
Os seguintes requisitos:
Suponha que já exista uma coleção de valor-chave do módulo de serviço definido, o FUNC é o novo serviço adicionado e a lista de parâmetros é a dependência do serviço.
A cópia do código é a seguinte:
var Service = {ABC: 123, def: 456, ghi: 789}; // Suponha que alguns serviços sejam definidos
Serviço de função (ABC, GHI) {
this.write = function () {
console.log (ABC);
console.log (ghi);
}
}
função ativitor (func) {
var obj;
// concluir
retornar obj;
}
Solução:
Através de algum mecanismo (reflexão?), Retire a lista de parâmetros definida pela func e atribua valores um por um. Então, por meio de algum mecanismo (ativador?), A func é instanciada.
Solução:
1. Obtenha a lista de parâmetros de func:
Como obter a lista de parâmetros? A primeira coisa que vem à mente é o mecanismo de reflexão. Então, há alguma reflexão em JavaScript? Deve estar lá. Só sei como usar a função Eval (STR) no momento, mas parece que não há implementação relevante para obter a lista de parâmetros. Vejamos a definição do func.arguds. Essa propriedade é válida apenas ao chamar func e passar parâmetros, e não pode atender às necessidades.
Então, podemos obter a lista de parâmetros processando a string após o func.toString ()?
Vamos tentar:
A cópia do código é a seguinte:
função getFuncParams (func) {
var com correspondência = func.toString (). MAKE (/^function/s*[^/(]*/(/s*([^/)]*)/)/m);
if (corresponde && correspondências.length> 1)
Retorno corresponde [1] .Prace (// s*/, '') .split (',');
retornar [];
};
Aqui, obtemos a matriz da lista de parâmetros FUNC.
2. Encontre dependências com base na lista de parâmetros:
Depois de obter a lista de parâmetros, ou seja, a lista de dependência é obtida. É muito simples passar a dependência nela como um parâmetro.
A cópia do código é a seguinte:
var params = getFuncParams (func);
para (var i em params) {
params [i] = serviços [params [i]];
}
3. Passe os parâmetros de dependência e instancie -os:
Sabemos que o JavaScript possui func.constructor, que possui duas funções: ligue para (thisArg, [arg [, arg, [arg, [...]]]]]) e aplique (thisarg, args…) e pode implementar operações de funções de instanciação. O primeiro parâmetro da função de chamada é este ponteiro e o restante é uma lista de parâmetros. Isso é adequado para uso quando uma lista de parâmetros FUNC é conhecida e não pode atender às minhas necessidades. Vejamos a segunda função Aplicar. O primeiro parâmetro também é este ponteiro e o segundo parâmetro é uma matriz de parâmetros. Quando chamado, ele atribuirá automaticamente valores à lista de parâmetros FUNC, um por um, que apenas atende às minhas necessidades.
O código é aproximadamente o seguinte:
A cópia do código é a seguinte:
função ativitor (func) {
var obj = {};
func.apply (obj, params);
retornar obj;
}
Neste ponto, podemos criar uma instância dessa func) e passar os parâmetros exigidos por esta func.
4. Imprima e teste:
Código completo:
A cópia do código é a seguinte:
var
// Suponha que alguns serviços sejam definidos
Serviços = {ABC: 123, def: 456, ghi: 789},
// Obtenha a lista de parâmetros de func (lista de dependência)
getFuncParams = function (func) {
var com correspondência = func.toString (). MAKE (/^function/s*[^/(]*/(/s*([^/)]*)/)/m);
if (corresponde && correspondências.length> 1)
Retorno corresponde [1] .Place (// S+/, '') .split (',');
retornar [];
},
// Preencha os parâmetros (dependências) de acordo com a lista de parâmetros (dependências)
setFuncParams = function (params) {
para (var i em params) {
params [i] = serviços [params [i]];
}
retornar params;
};
// ativador
função ativitor (func) {
var obj = {};
func.apply (obj, setfuncParams (getFuncParams (func)));
retornar obj;
}
// Defina um novo serviço
Serviço de função (ABC, GHI) {
this.write = function () {
console.log (ABC);
console.log (ghi);
}
}
// instanciar o serviço e chamar o método
var serviço = ativador (serviço);
Service.Write ();
O console foi impresso com sucesso!