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