AngularJS 避免继承原始值

示例

在javascript中,分配非原始值(例如Object,Array,Function等),将保留对分配值的引用(内存中的地址)。

将原始值(字符串,数字,布尔值或符号)分配给两个不同的变量,然后更改一个,则不会同时更改两个变量:

var x = 5;
var y = x;
y = 6;
console.log(y === x, x, y); //假5、6

但是对于非原始值,由于两个变量只是保持对同一对象的引用,因此更改一个变量更改另一个变量:

var x = { name : 'John Doe' };
var y = x;
y.name = 'Jhon';
console.log(x.name === y.name, x.name, y.name); //是的,约翰,约翰

在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()

仅将非原始值用作作用域属性将使您安全(除非您需要不继承的属性,或者您知道作用域继承的其他情况)。