如何将依赖关系传递给AngularJS中的原型函数

时间:2016-03-25 16:12:20

标签: javascript angularjs prototypal-inheritance

在原型函数中是否有一种不那么冗长的访问依赖关系(即构造函数参数)的方法?特别是AngularJS Services

我只知道

{{1}}

3 个答案:

答案 0 :(得分:1)

这实际上是documentation

中描述的官方方式
function SomeClass(greeter) {
  this.greeter = greeter;
}

SomeClass.prototype.doSomething = function(name) {
  this.greeter.greet(name);
}

但我会考虑使用ES2015类语法。

export default class SomeClass {
  constructor(greeter) {
    this._greeter = greeter;
  }

  doSomething() {
    this._greeter.greet(name);
  }
}

您可以阅读更多here

答案 1 :(得分:1)

我所知道的最短时间是避免在外部范围内使用原型而只是使用闭包:

function SomeSrvc($http, ...other deps...) {
  var srvc = this;

  srvc.doSomething = function() {
    // just use $http without this / srvc
  };
}

简短又好看。如果你真的喜欢类似原型的语法,只需调整缩进(但在我看来这会更加丑陋):

function SomeSrvc($http, ...other deps...) {
  var srvc = this;



srvc.doSomething = function() {
  // Do stuff with srvc.$http and other srvc.deps...
};

}

这会产生相同的效果 - 使用new运算符创建的对象将具有此功能,并且以这种方式创建角度服务。

此外,这种方式具有非常好的副作用。它不会在服务对象上创建变量,因此可以将它们视为private,将所有变量分配给服务使它们public并且可以从另一个角度模块访问它们。目前只需注入您的服务,您就可以通过调用例如

来使用所有注入的模块
SomeSrvc.$http

这完全违背了依赖注入的整个想法。

答案 2 :(得分:0)

服务,而不是控制器,我一直在做一些不同的事情

module.factory('myService', function(dep1, dep2){
    var createInternal=function(){ 
        var internal = Object.create(proto);
        internal.init( ... ); 
        return internal;
    };
    var service = function(){ 
        var internal = createInternal(); 
        return { 
            doSomething: function(a, b, c){ return internal.doSomething(a,b,c); },
            ...
        };
    };
    var proto = { 
        init: function( ... ){ 
                  dep1.greet();
                  dep2.doSomethingElse(); 
                  ... 
              },
        doSomething: function(a, b, c){ 
                  dep1.grito(b);
                  dep2.haceOtraCosa();
              },
        ...
    };
    return service();
});

它有点不同,但它将其分解为标题和原型函数列表,我喜欢它。