2017-03-04 2 views
-1

, 나는 증분 값을 설정하려는 배열 객체에 설정하지 :자바 스크립트 변수가 나는 자바 스크립트에서이 실행

var parts = {}; 
var parts_default = {success: function(){}, dane: "cos tam"}; 
for (var i = 1; i <= 3; i++) { 
    parts[i] = parts_default ; 
    parts[i].varX = i ; 
} 
console.log(parts); 

을 내가 가지고 결과 :

{ 
"1": { 
    "dane": "cos tam", 
    "varX": 3 
    }, 
    "2": { 
    "dane": "cos tam", 
    "varX": 3 
    }, 
    "3": { 
    "dane": "cos tam", 
    "varX": 3 
    } 
} 

변수 varX는, 같은 값 3을 가지고 있지만 아래 예상대로 :

{ 
"1": { 
    "dane": "cos tam", 
    "varX": 1 
    }, 
    "2": { 
    "dane": "cos tam", 
    "varX": 2 
    }, 
    "3": { 
    "dane": "cos tam", 
    "varX": 3 
    } 
} 

무엇이 잘못 되었나요?

+0

'part [i] = parts_default'이면 동일한 객체를 모든 속성에 설정합니다. 'parts [1] === parts [2] && parts [2] === parts [3]'이므로,'parts [i] .varX'를 사용할 때 같은 객체를 수정합니다. –

+0

reference는 각각 메모리에있는 동일한 객체에 대한 포인터 일뿐입니다. – Sam

답변

0

당신은 루프에 같은 객체 parts 각 시간을 추가하고 있기 때문에 당신이 할 때

parts[i] = parts_default; 

복사 객체 참조, 그 대상이 아닙니다. 그러면 할 때

parts[i].varX = i; 

당신은 그 하나의 개체를 업데이트하고 있습니다.

당신은 이전의 자바 스크립트 엔진 polyfilled 할 수있는 새로운 Object.assign 기능과 객체를 복사 할 수 있습니다 :

var parts = {}; 
 
var parts_default = {success: function(){}, dane: "cos tam"}; 
 
for (var i = 1; i <= 3; i++) { 
 
    parts[i] = Object.assign({}, parts_default); 
 
    parts[i].varX = i ; 
 
} 
 
console.log(parts);

참고 모든 개체가 같은 success 기능을 공유 할 것입니다.

+0

첫 번째 접근법에서도 동일한 작업을했는데 왜 출력 결과가 마지막 2 개 개체에 대해 ** ref : 3 **'으로 표시되는지 설명합니다. 이 때마다 다른 객체가 생성되지 않아야합니까? – Rajesh

+1

@Rajesh : 그렇습니다. 그러나 그것은 얕은 사본입니다. 위에서 말했듯이, 동일한 '성공'기능은 모든 사본에서 공유됩니다. (어느 쪽이 좋을지도 모릅니다.) 그것이'ref :'것에 관한 것입니다. –

0

Object.create을 사용하여 새 개체를 만들 수 있습니다.

Object.create() 메서드는 지정된 프로토 타입 개체와 속성을 사용하여 새 개체를 만듭니다.

var parts = {}; 
 
var parts_default = { success: function() {}, dane: "cos tam" }; 
 
for (var i = 1; i <= 3; i++) { 
 
    parts[i] = Object.create(parts_default); 
 
    parts[i].varX = i; 
 
} 
 

 
console.log(parts);

관련 문제