我无意中污染了一个服务,但我认为我只是将其分配给一个范围。例如:AngularJS - 外部污染提供商,服务和工厂
var ServiceFunction = function ServiceFunction(){
this.greeting = 'Hello';
};
var TestController = function TestController(testService){
var testCtrl = this;
testCtrl.testService = testService;
//here I make changes within the controller. This amends the service itself
testCtrl.testService.newProperty = 'new value';
};
angular.module('test',[])
.service('testService',ServiceFunction)
.controller(['testService',TestController])
这里是一个Plunker来演示此行为:
https://plnkr.co/edit/nDkNfKmQRtcBuJ0NUcHo?p=preview
我知道,JavaScript是通过引用传递,当涉及到的对象传递给函数。除非这些对象被深度克隆。
我曾经假定服务之外的某些东西可以访问由该服务公开的对象等,但只能通过价值获得,并且对该服务的任何更改都必须由该服务提供的api来完成。看起来唯一的方法是使用angular.copy
在上面的例子中testCtrl.testService = angular.copy(testService);
我猜这肯定是有意的行为。如果是这样,除了性能优势,我认为这是一个缺点。
为什么AngularJS允许这种行为,而不是“黑匣子”提供者?
这是JavaScript原型继承的工作原理;功能是对象。顺便提一下,提供者是单身人士,使用'angular.copy'来“克隆”提供者可能会产生意想不到的副作用。 – Claies
让用户不要误解JS如何工作,这不是框架的责任。顺便说一句,你期望什么样的答案? – estus
@estus我只是想,如果你打算打电话给一个服务,它应该像一个服务。如果我为您提供一箱牛奶送到您的房子,然后您拿起箱子并取出几瓶酒,我不会期望从我的货车的每个箱子中取出2个瓶子,或者您可以更换任何东西在我的面包车到酸奶箱。我期望的答案是可能突出显示我自己看不到的好处的答案。 – dewd