如果我有一些基础工厂有一堆方法,我想扩展到其他一些工厂,如
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但结果相同。
答案 0 :(得分:2)
在service
的定义中将this
更改为service.screech
:
service.screech = function() {
alert(this.name + this.lastname)
}
它没有用,因为当你在{/ 1}} 内部引用service
时,由于closure,service
被硬编码到定义时的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;
}