在角度工厂内设置* .prototype方法不起作用

时间:2016-02-05 04:15:34

标签: javascript angularjs

我正在创建一个封装和可注射类型的角度工厂,可以这样修改:

(function() {
angular
  .module('app')
  .factory('PaymentStream', [

function() {

    function PaymentStream(){

        this._endingBalance = null;
    }

    PaymentStream.prototype.serialize = function() {

        // method body here
    };

    return PaymentStream;

   }]);
})();

当我通过new PaymentStream()创建PaymentStream时,似乎只调用了构造函数。如果我不使用prototype并且只是在构造函数中定义方法,那么它可以工作,但我会重新定义每个实例的函数。

知道为什么没有设置这些原型吗?

修改

以下是如何在外面使用它。

    function addStreamFunctions(stream) {

        angular.merge(stream, new PaymentStream());
    }

2 个答案:

答案 0 :(得分:1)

因此,基于您的编辑,工厂确实正常工作。问题在于你使用它的方式,angular.merge new ed对象与另一个对象,因此它的类型不再是PaymentStream,结果对象变为&#39}。通用' object

如果流是普通对象,您可以做的是在stream的构造函数中传递PaymentStream变量,并在构造函数内手动合并。像

这样的东西
function PaymentStream(stream){

    this._endingBalance = null;

    var keys = Object.keys(stream); //get all properties from the stream

    keys.forEach(function(key){
       this[key] = stream[key];   //put each one in the instance of your object;
    });

}

然后像

一样使用它
function addStreamFunctions(stream) {

    var stream = new PaymentStream(stream);

}

此代码未经测试,请告诉我它是否有效:)

答案 1 :(得分:0)

由于您正在使用factory,因此您需要返回该对象的实例,在本例中为PaymentStream的新实例

(function() {
  angular.module('my-app').factory('PaymentStream', [function() {
    function PaymentStream() {
      this._endingBalance = null;
    }

    PaymentStream.prototype.serialize = function() {
      // method body here
    };

    return new PaymentStream();
  }]);
})();