避免继承原始值

在 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() 函数),并且跟踪范围树可能是不可能的。

仅使用非原始值作为范围属性将使你处于安全状态(除非你需要不继承的属性,或者你知道范围继承的其他情况)。