避免繼承原始值

在 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() 函式),並且跟蹤範圍樹可能是不可能的。

僅使用非原始值作為範圍屬性將使你處於安全狀態(除非你需要不繼承的屬性,或者你知道範圍繼承的其他情況)。