当我推送到数组时,它也会推送到另一个数组

时间:2016-10-20 16:03:28

标签: javascript angularjs

这是JS:

angular.module('app', [])
  .controller('fooCtrl', function($scope){
    var fooProto = {
      arrayItems: [],
      addItem: function(){
        var self = this;
        self.arrayItems.push(new Date());
      }
    };
    $scope.fooes = [];
    $scope.foo1 = angular.extend({}, fooProto);
    $scope.foo2 = angular.extend({}, fooProto);
});
CodePen与HTML: http://codepen.io/qn0361/pen/vXQqPG

如何逃避? 谢谢!

1 个答案:

答案 0 :(得分:2)

因为你有一个拥有数组的对象

 var fooProto = {
      arrayItems: [],
      addItem: function(){
        var self = this;
        self.arrayItems.push(new Date());
      }
    };

Array是一种引用类型。因此,当您复制对象时,它会复制属性,如果属性是引用类型,则复制引用

$scope.foo1 = angular.extend({}, fooProto);

$scope.foo1获取参考文献的副本,它们都引用同一个对象。因此,您使用两个引用来处理同一个对象,这两个引用引用相同的array

您可以使用constructor-function

进行修复
function foo(){
   this.arrayItems = [];
   this.addItem = function(){
      this.arrayItems.push(new Date());
   }
}

var foo1 = new foo();
var foo2 = new foo();

在这里,您将有两个foo个实例,每个实例都有自己的arrayItems

在您的情况下,您不需要复制项目,因为据我所知,您这样做是为了不复制,而是创建'type'的新实例。