DI(의존성 주입) 패턴을 들어보셨겠죠?
인기 있는 백엔드 Spring 프레임워크든, 프론트엔드 트렌드인 angular.js든, 종속성 주입은 어디에서나 볼 수 있습니다.
용어가 좀 모호하지만 핵심은 아주 간단합니다.
“바람을 원하면 바람이 되고, 비를 원하면 비가 온다”라는 속담을 사용하여 , 즉 “바람이 있으면 비가 온다” 먹을 땐 입을 벌리고, 옷을 입을 땐 손을 내민다”.
제 설명을 듣고도 여전히 약간 혼란스러우실 수 있습니다. 먼저 예를 들어보겠습니다.
다음은 "종속성"이라고도 하는 일부 모듈이며 해시 개체에 저장됩니다.
var deps = { 'firstDependency': function () {return 'this is firstDependency';}, 'secondDepency': function () {return 'this is secondDepency';}, };
다음은 은 종속성 주입 관리자이며 때가 되면 new됩니다.
var DI = function (dependency) { this.dependency = dependency; };
new이면 <🎜를 전달하세요. >deps를 매개변수로 사용합니다.
자, 이제 문제의 핵심인 작성해야 할 내용이 나옵니다.DI.prototype.inject = function (func) {......};
var di = new DI(deps); var myDependentFunc = di.inject(function (secondDepency, firstDependency) { firstDependency(); secondDepency(); }); myDependentFunc();
먼저
inject에 의해 전달된 익명 함수를 살펴보겠습니다. 이는 요구사항을 나타내며 여기에 주입이 필요합니다.
secondDepency, firstDependency
toString() 형식을 가져옵니다.
//第一步 DI.prototype.inject = function (func) { func.toString(); };
그런 다음 string, 모든 형식 매개변수 찾기:
//第二步 DI.prototype.inject = function (func) { var args = findArgs(func.toString()); };
String.prototype.trim=function(){ return this.replace(/(^\s*)|(\s*$)/g, ""); }; var findArgs = function(funcStr){ var bracket1 = funcStr.indexOf("("); var bracket2 = funcStr.indexOf(")"); var argsStr = funcStr.slice(bracket1+1,bracket2); var args = argsStr.split(","); return args.map(function(e){ return e.trim(); }); };
realArgs는 실제 매개변수 목록을 참조합니다.
//第三步 DI.prototype.inject = function (func) { var args = findArgs(func.toString()); var realArgs = []; for(var i=0;i<args.length;i++){ var dep = this.dependency[args[i]]; if(dep){ realArgs.push(dep); } } //...... };
마지막 단계는
Inject , inject는 익명 함수를 반환합니다. 익명 함수가 실행되면 실제 매개변수 목록은 클로저를 통해 얻어지고 func에 주입됩니다.
DI.prototype.inject = function (func) { var args = findArgs(func.toString()); var realArgs = []; for(var i=0;i<args.length;i++){ var dep = this.dependency[args[i]]; if(dep){ realArgs.push(dep); } } return function(){ return func.apply(null,realArgs); }; }
위 내용은 JavaScript: 의존성 주입에 관한 흥미로운 질문입니다. 더 많은 관련 내용을 보려면 PHP 중국어 웹사이트(www.php.cn)를 참고하세요!