AngularJS - 外部污染供应商、服务和工厂

AngularJS - Polluting provider, services, and factories externally

我无意中用我认为只分配给范围的属性污染了服务。示例:

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 允许这种行为而不是 "blackbox" 供应商?

从问题下的评论中的讨论得出结论,AngularJS 似乎没有特定的理由允许这种行为,除了服务没有被封装为仅 api访问它们。

因此,JavaScript 的正常规则适用,即传递给函数的服务,例如directivecontroller 通过引用传递给服务对象,对该引用的任何更改都会直接在源更新对象。由于服务是单例的,因此更改会反映在使用该服务的整个应用程序中。

这种方法有性能优势,因为它是自然的 JavaScript 行为。