避免繼承原始值
在 JavaScript 中,分配非原始值(如物件,陣列功能,和許多更多),保持基準(在儲存器中的地址),以所分配的值。
將原始值(String,Number,Boolean 或 Symbol)分配給兩個不同的變數,並更改一個變數,不會同時更改這兩個變數:
var x = 5;
var y = x;
y = 6;
console.log(y === x, x, y); //false, 5, 6
但是使用非原始值,因為兩個變數都只是保持對同一物件的引用,所以更改一個變數將改變另一個變數 :
var x = { name : 'John Doe' };
var y = x;
y.name = 'Jhon';
console.log(x.name === y.name, x.name, y.name); //true, John, John
在 angular 中,當建立範圍時,會為其分配其所有父級屬性。但是,之後更改屬性只會影響父範圍(如果它是非原始值):
angular.module('app', [])
.controller('myController', ['$scope', function($scope){
$scope.person = { name: 'John Doe' }; //non-primitive
$scope.name = 'Jhon Doe'; //primitive
}])
.controller('myController1', ['$scope', function($scope){}]);
<div ng-app="app" ng-controller="myController">
binding to input works: {{person.name}}<br/>
binding to input does not work: {{name}}<br/>
<div ng-controller="myController1">
<input ng-model="person.name" />
<input ng-model="name" />
</div>
</div>
請記住:在 Angular 中,可以通過多種方式建立範圍(例如內建或自定義指令或 $scope.$new()
函式),並且跟蹤範圍樹可能是不可能的。
僅使用非原始值作為範圍屬性將使你處於安全狀態(除非你需要不繼承的屬性,或者你知道範圍繼承的其他情況)。