如何正确扩展angularJS工厂

时间:2018-03-12 19:51:40

标签: javascript angularjs

如果我有一些基础工厂有一堆方法,我想扩展到其他一些工厂,如

function TestFactory() {

    var service = {};

    service.name = null
    service.lastname = null

    service.screech = function() {
       alert(service.name + service.lastname)
    }

    return service;

}

我想将该功能扩展到其他服务,例如

function NewFactory() {

    var service = angular.copy(TestFactory)

    service.name = 'Cool'
    service.lastname = 'Guy'

    return service;

}

我希望NewFactory.screech()提醒“CoolGuy”,但它似乎是在原始TestFactory范围内调用screech方法,其中name和lastname为null。

我怎样才能完成这种模式?

我也尝试过使用angular.extend但结果相同。

2 个答案:

答案 0 :(得分:2)

service的定义中将this更改为service.screech

service.screech = function() {
   alert(this.name + this.lastname)
}

它没有用,因为当你在{/ 1}} 内部引用service 时,由于closureservice被硬编码到定义时的service对象。您制作副本时未更新引用。另一方面,this是动态的,并且始终引用正在调用函数的对象,例如,与service.screech()

此外,您需要将service设置为TestFactory中对象结果的副本,而不是TestFactory本身的副本:< / p>

var service = angular.copy(TestFactory())

答案 1 :(得分:2)

将服务变量更改为此。 Closure将服务变量绑定到函数,而服务应该使用对象的范围,以便可以继承它。

工厂内的所有功能都应该使用它来引用对象。

function TestFactory() {

    var service = {};

    service.name = null
    service.lastname = null

    service.screech = function() {
       alert(this.name + this.lastname)
    }

    return service;

}

同时更改以下代码以返回工厂对象而不是工厂函数

function NewFactory() {

    var service = angular.copy(TestFactory())

    service.name = 'Cool'
    service.lastname = 'Guy'

    return service;

}