2016-10-20 20 views
-4

これはJSです:HTMLと私は配列にプッシュすると、それはまた別の配列にプッシュ

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: http://codepen.io/qn0361/pen/vXQqPG

それから逃れるためにどのように? ありがとうございました!

+7

これらのオブジェクトはすべて同じ配列インスタンスを共有します。あなたはそれをすることはできません。 – SLaks

+0

"コピーされた"オブジェクトは実際には_same_オブジェクトを指しています。したがって、一般的には 'arr1 = [];です。 arr2 = arr1; 'は単一の配列になり、' arr1'と 'arr2'の両方がそれを参照します。 – vlaz

答えて

2

あなたは、配列

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

アレイは、あなたのオブジェクトをコピー、それをコピー性質type.So参照し、プロパティが参照型であれば持っているオブジェクトを持っているのでそれコピー

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

$scope.foo1はreferenece、彼らはすべてのコピーを取得し、参照同じオブジェクトを参照してください。したがって、同じオブジェクトを2つの参照で操作します。これは同じarrayを参照しています。

は、あなたはそれらのそれぞれが、それはarrayItems自分のしている、あなたはfooの2つのインスタンスを持つことになります。ここconstructor-function

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

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

でそれを修正することができます。

あなたの場合、コピーするのではなく、新しいインスタンスを作成することを理解しているので、アイテムをコピーする必要はありません。'タイプ'

+0

この問題を修正しました。つまり、各インスタンスにコンストラクタ内の空の配列を与えます... –

+0

したがって、protoの外で配列を使用して、それぞれのインスタンス内に作成する必要がありますか? –

+0

@SergeyTyrtyshnikov更新された部分を参照してください、私はあなたがそれを望むと思います。 –

関連する問題