`

AngularJs 之service injection 根据参数名获取对象-源码分析

阅读更多
在 Angular 中,使用 controller时,如果需要某 service,只需要在参数中写上这个 service的名称即可。

那么是如何实现的呢?

问题思考:

javascript 中如何获取函数的参数的名称/字面值?

在 javascript 中是否有方法获取 function 的参数的 名称的值?

比如:

function doSomething(param1, param2, .... paramN)
{
   // fill an array with the parameter name and value
   // some other code 
}


如何获取 doSomething 函数的参数的名称列表?


回答一:

下面的方法可以返回函数的参数(简单格式的参数)


var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
var ARGUMENT_NAMES = /([^\s,]+)/g;
function getParamNames(func) {
  var fnStr = func.toString().replace(STRIP_COMMENTS, '');
  var result = fnStr.slice(fnStr.indexOf('(')+1, fnStr.indexOf(')')).match(ARGUMENT_NAMES);
  if(result === null)
     result = [];
  return result;
}



测试:
getParamNames(getParamNames) // returns ['func']
getParamNames(function (a,b,c,d){}) // returns ['a','b','c','d']
getParamNames(function (a,/*b,c,*/d){}) // returns ['a','d']
getParamNames(function (){}) // returns []





回答二:

下面的代码从 Angular 的源码中拷贝的。用于其依赖注入机制的使用。

http://docs.angularjs.org/tutorial/step_05

如果 controller 在其构造函数的参数列表中含有对某个 service 名称的引用,当 controller 的构造方法被调用时, Angualr 的依赖注入机制提供 service 给 controller。依赖注入机制还负责 service 本身依赖其它 service 时的过渡service的创建。

注意: 参数的名称很重要。因为依赖注入机制依靠参数的名称去获取对应的服务。


/**
 * @ngdoc overview
 * @name AUTO
 * @description
 *
 * Implicit module which gets automatically added to each {@link AUTO.$injector $injector}.
 */

var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
var FN_ARG_SPLIT = /,/;
var FN_ARG = /^\s*(_?)(.+?)\1\s*$/;
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
function annotate(fn) {
  var $inject,
      fnText,
      argDecl,
      last;

  if (typeof fn == 'function') {
    if (!($inject = fn.$inject)) {
      $inject = [];
      fnText = fn.toString().replace(STRIP_COMMENTS, '');
      argDecl = fnText.match(FN_ARGS);
      forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){
        arg.replace(FN_ARG, function(all, underscore, name){
          $inject.push(name);
        });
      });
      fn.$inject = $inject;
    }
  } else if (isArray(fn)) {
    last = fn.length - 1;
    assertArgFn(fn[last], 'fn')
    $inject = fn.slice(0, last);
  } else {
    assertArgFn(fn, 'fn', true);
  }
  return $inject;
}
















引用:
How to get function parameter names/values dynamically from javascript


--转载请注明出处:http://lixh1986.iteye.com/blog/2314610





--






分享到:
评论

相关推荐

    JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

    $ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address] where: -C - command executed in the remote classfile. (optional , default command is "open /Applications/...

    JNDI-Injection-Exploit-1.0-SNAPSHOT-all.zip

    在压缩包中有一个文件名为 "JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar",这很可能是一个Java可执行的jar文件,其中封装了用于演示JNDI注入攻击或者进行安全测试的代码。用户可以通过运行这个jar文件来触发或者...

    JNDI-Injection-Exploit-1.0-SNAPSHOT-all

    该压缩包"JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar"可能包含了一个JNDI注入攻击的示例或者测试工具,"SNAPSHOT"通常表示这是一个开发中的版本,可能尚未经过完整测试,因此可能存在漏洞或不稳定性。使用这样的...

    making-sense-dependency-injection-test-execution-listener-源码.rar

    本文将通过分析"making-sense-dependency-injection-test-execution-listener-源码"来深入探讨这两个概念。 1. 依赖注入(Dependency Injection) 依赖注入的核心思想是,对象不应该自行创建或查找它所依赖的对象...

    angularjs Web页面框架 v11.2.4-源码.zip

    AngularJS的双向数据绑定是其最显著的特点之一。它自动同步模型(Model)和视图(View)的数据,使得UI和应用状态始终保持一致。当你在视图中做出更改时,模型会自动更新;反之亦然。这种机制减少了开发者手动管理...

    dependency_injection-develop-源码.rar

    在这个"dependency_injection-develop-源码"压缩包中,我们可以深入理解依赖注入的实现原理及其在实际开发中的应用。 依赖注入的核心思想是将对象之间的依赖关系从对象内部移出,转由外部容器来管理。这样,对象...

    dependency_injection-1_0-final-spec.zip

    这个压缩包"dependency_injection-1_0-final-spec.zip"包含了对Java依赖注入规范1.0版本的详细定义,包括API jar文件(javax.inject.jar)、Javadoc文档(javax.inject-javadoc.zip)以及源码(javax.inject-src.zip...

    Dependency Injection with AngularJS

    2. 服务:在AngularJS中,服务(Service)是一种可复用的代码块,可以被注入到其他控制器(Controller)、指令(Directive)、过滤器(Filter)等中。 3. 提供者(Provider):提供者是用于配置依赖项的一个高级抽象...

    mysql-injection.pdf

    首先,文件标题“mysql-injection.pdf”和描述“MySQL注入天书---------Sqli-labs 使用手册”明确指出了文档的主题,即如何进行MySQL注入以及sqli-labs工具的使用说明。sqli-labs是一个SQL注入学习平台,可以让学习...

    AngularJs Dependency Injection(DI,依赖注入)

    AngularJS的依赖注入(Dependency Injection,简称DI)是一种软件设计模式,用于管理应用程序中的对象如何获取它们所需的依赖。依赖注入的主要目标是降低组件之间的耦合,使得代码更加灵活、可测试和可维护。 1. ...

    angularjs中文教程step7源码

    在AngularJS中,数据绑定是其核心特性之一,它允许开发者在视图和模型之间建立直接的连接。双向数据绑定使得视图的改变能够实时反映到模型中,反之亦然。在这个阶段的源码中,我们可以看到如何通过`ng-model`指令...

    AngularJS开发ASP.NET MVC

    - **依赖注入(Dependency Injection)**:AngularJS的依赖注入机制使得开发者可以更容易地管理对象间的依赖关系,提高了代码的可测试性和可维护性。 #### 如何在ASP.NET MVC项目中引入AngularJS 要在ASP.NET MVC...

    jndi-JNDI-Injection-Exploit

    java asm jndi_JNDI-Injection-Exploit,用于log4j2漏洞验证 可执行程序为jar包,在命令行中运行以下命令: $ java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar [-C] [command] [-A] [address] 其中: -C ...

    AngularJS之依赖注入模拟实现

    AngularJS是一个流行的前端框架,它的核心特性之一就是依赖注入(Dependency Injection,简称DI)。依赖注入是设计模式的一种,它实现了控制反转(Inversion of Control,简称IoC),使得代码之间的耦合度降低,提高...

    -Injection-Poisoning-Binary-Translation-Cache.pdf

    AS-23-Koh-Dirty-Bin-Cache-A-New-Code-Injection-Poisoning-Binary-Translation-Cache

    Java-EE-8-Design-Patterns-and-Best-Practices-源码.rar

    《Java EE 8 设计模式与最佳实践》源码分析 在Java开发领域,Java EE(Enterprise Edition)作为企业级应用开发的标准平台,为开发者提供了丰富的功能和组件。设计模式和最佳实践是Java EE开发中不可或缺的部分,...

    angularjs-master

    3. **依赖注入**:AngularJS 的依赖注入(Dependency Injection,DI)机制允许组件轻松获取所需的依赖服务,如 `$http` 用于HTTP请求,`$scope` 用于管理作用域内的数据。这提高了代码的可测试性和可维护性。 4. **...

    《angularJs深度剖析与最佳实践》源码

    2. **依赖注入**:AngularJS的依赖注入(Dependency Injection,DI)系统简化了对象之间的协作。通过阅读源码,可以了解如何定义服务、控制器、过滤器等,并使用`angular.module`和`angular.injector`进行注入。 3....

    Residence-Advisor-Angular-源码.rar

    【标签】虽然没有具体的标签,但根据标题可以推断,相关的标签可能包括:AngularJS、前端开发、单页应用、住宅顾问、项目源码、JavaScript框架、Web开发等。 在源代码中,我们可能会看到以下关键知识点: 1. **...

Global site tag (gtag.js) - Google Analytics