В настоящее время все рамки являются модульными, а даже фронтальный JavaScript не является исключением. Каждый модуль отвечает за определенные функции, и между модулями существует взаимозависимость. Итак, вопрос: как внедрить инъекцию зависимости в JavaScript? (Инъекция зависимости JavaScript, основные рамки имеют соответствующие реализации, здесь изучены только идеи реализации)
Следующие требования:
Предположим, что уже существует определенная коллекция ключевых значений модуля обслуживания, Func является дополнительной новой услугой, а список параметров-это зависимость от обслуживания.
Кода -копия выглядит следующим образом:
var services = {abc: 123, def: 456, ghi: 789}; // Предположим, что некоторые услуги определены
Функциональная служба (ABC, GHI) {
this.write = function () {
console.log (abc);
console.log (ghi);
}
}
Функциональный активитор (func) {
var obj;
// выполнить
вернуть OBJ;
}
Решение:
Через какой -то механизм (отражение?) Уберите список параметров, определяемый FUNC и назначьте значения один за другим. Затем, через какой -то механизм (активитор?), Функция создается.
Решение:
1. Получите список параметров фанк:
Как получить список параметров? Первое, что приходит на ум, - это механизм отражения. Так есть ли какое -либо размышление в JavaScript? Это должно быть там. Я знаю только, как использовать функцию Eval (STR) в данный момент, но кажется, что не существует соответствующей реализации для получения списка параметров. Давайте посмотрим на определение FunC.Arguments. Это свойство действительна только при вызове Func и прохождения параметров и не может удовлетворить потребности.
Итак, можем ли мы получить список параметров, обработав строку после func.tostring ()?
Попробуем:
Кода -копия выглядит следующим образом:
function getFuncparams (func) {
VAR Matches = func.toString (). Match (/^function/s*[^/(]*/(/s*([^/)]*)/)/m);
if (Matches && matches.length> 1)
return Matches [1] .replace (// s*/, '') .split (',');
возвращаться [];
};
Здесь мы получаем массив списков параметров Func.
2. Найдите зависимости на основе списка параметров:
После получения списка параметров, то есть получен список зависимостей. Очень просто передать в нее зависимость в качестве параметра.
Кода -копия выглядит следующим образом:
var params = getfuncparams (func);
для (var i in params) {
params [i] = services [params [i]];
}
3. Передайте параметры зависимости и экземпляруйте их:
Мы знаем, что у JavaScript есть Func.constructor, который имеет две функции: Call (thisarg, [arg [, arg, [arg, […]]]]) и применить (thisarg, args…) и может реализовать операции фан -фан -экземпляра. Первым параметром функции вызова является указатель, а остальное - список параметров. Это подходит для использования, когда известен список параметров Func и не может удовлетворить мои потребности. Давайте посмотрим на вторую функцию применения. Первый параметр также является этим указателем, а второй параметр - массив параметров. При вызове он автоматически назначает значения в список параметров фонда один за другим, что просто отвечает моим потребностям.
Код примерно следующим образом:
Кода -копия выглядит следующим образом:
Функциональный активитор (func) {
var obj = {};
func.apply (obj, params);
вернуть OBJ;
}
На этом этапе мы можем создать экземпляр этого фонда и передать параметры, требуемые этим фанком.
4. Распечатайте и проверяйте:
Полный код:
Кода -копия выглядит следующим образом:
вар
// Предположим, что некоторые услуги определены
Services = {ABC: 123, def: 456, ghi: 789},
// Получить список параметров Func (список зависимостей)
getFuncparams = function (func) {
VAR Matches = func.toString (). Match (/^function/s*[^/(]*/(/s*([^/)]*)/)/m);
if (Matches && matches.length> 1)
return Matches [1] .replace (// s+/, '') .split (',');
возвращаться [];
},
// заполнить параметры (зависимости) в соответствии с списком параметров (зависимости)
setfuncparams = function (params) {
для (var i in params) {
params [i] = services [params [i]];
}
вернуть параметры;
};
// активатор
Функциональный активитор (func) {
var obj = {};
func.apply (obj, setfuncparams (getfuncparams (func)));
вернуть OBJ;
}
// Определите новую услугу
Функциональная служба (ABC, GHI) {
this.write = function () {
console.log (abc);
console.log (ghi);
}
}
// создание службы и вызовите метод
var service = activator (service);
service.write ();
Консоль была успешно напечатана!