我無意中污染了一個服務,但我認爲我只是將其分配給一個範圍。例如: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