2014-05-16 4 views
0

부모 객체 내에서 하위 객체의 값을 변경하는 데 Javascript가 어떻게 반응하는지 알아보기 위해 작은 테스트를 수행했습니다. 부모가 자식을 참조하고 새로운 값으로 최신 정보를 유지하는지, 인스턴스화 된 자식의 초기 상태 만 유지 하는지를보고 싶었습니다.Javascript 객체 참조 자식

난 당신이 콘솔에서 볼, 작은 모듈을 coords.js

var NS = NS || {}; NS.Coords = function(){ var __parentArray = {}; var __childArray = {}; addToParent = function(){ __childArray['value'] = "Initial"; __parentArray['child'] = __childArray; }, showParent = function(){ console.log("Parent: ",__parentArray); console.log("Child within parent: ",__parentArray['child']); }, changeChild = function(){ __childArray['value'] = "Changed"; }, showChild = function(){ console.log("Child: ",__childArray]); }; return { addToParent: addToParent, showParent: showParent, changeChild: changeChild, showChild: showChild }; }(); 

그리고 main.js

이를 실행하면

var NS = NS || {}; 

// @codekit-prepend "Coords.js" 

console.log("============================="); 
console.log("Startpoint point"); 
console.log("============================="); 
var coords = NS.Coords; 
coords.addToParent(); 
coords.showChild(); 
coords.showParent(); 

console.log("============================="); 
console.log("Changed child value"); 
console.log("============================="); 
coords.changeChild(); 
coords.showChild(); 
coords.showParent(); 
에서

을 직접 보여 때, 아이는 예상 된 "초기"값과 "변경된"값을 보여줍니다.

그러나 부모는 항상 참조하는 하위 개체의 "변경된"값을 표시합니다. changeChild()가 호출되기 전에도. 이유는 모르겠다. 값을 변경하지 않고도 변경되었음을 알 수 있습니다. 슈퍼 간단한 것을 놓친 건가요? 아니면 여기서 무슨 일이 일어나고 있는지 오해하고 있습니까?

+2

항상 (항상 그런 것은 아니지만 바이올린을 가지고있는 것이 좋습니다) 바이올린을 설정해야하므로 결과를 확인할 수도 있습니다. –

+0

나는 n00b이다. 할거야! – Gurnzbot

답변

1

첫 번째 문제는 내가이 문제가되지 않습니다 의미하지만 속성을 변경하는 경우, 콘솔은 자동적으로 너무 업데이트 잊지 마세요, 당신은 아마 GOOGLE CHROME을 사용하는 것입니다. (마법 같은가요?)

console.log("Child within parent: ",__parentArray['child']);console.log("Child within parent: ",__parentArray['child']['value']);으로 변경하면 스크립트가 올바르게 작동하는 것을 볼 수 있습니다. 이 코드의 일부 구문 오류가 있지만 그 고정되면, 당신이 설명하고있는 문제가 발생하지 않습니다 http://jsfiddle.net/M4Cd8/

+0

예 ... 크롬. 나는 이것을 알지 못했다. showParent() 함수는 콘솔에 인쇄 할 때 자식에 대한 직접적인 참조와 부모 자체에 대한 로깅을 가지고 있습니다. 심지어 (가치 지표 자체를 재정의하지 않고도) 내가 예상 한 것을 보여줍니다. – Gurnzbot

+0

changeChild()를 호출하기 전에 콘솔에서 자식 객체를 변경하는 이유에 대해 설명 할 수 있습니까? 어쩌면 "자동적으로"무엇을 의미하는지 설명 할 수 있습니까? haha;) – Gurnzbot

+0

changeChild()를 호출하기 전에 값을 변경하지 않습니다. setTimeout을 사용하여 지연시킬 수 있으면 AFTEr을 변경합니다.Google 크롬은 (사용자와 마찬가지로) 객체를 참조하므로 콘솔에서도 값이 변경됩니다. –

1

: 여기

는 바이올린입니다. 일부 브라우저 콘솔은 오브젝트에 대한 인라인 참조를 제공하며 오브젝트가 변경 될 때 업데이트됩니다. 대답은 전체 개체가 아닌 값 문자열을 관찰하는 것입니다

console.log("Child within parent: ",__parentArray['child'].value); 
console.log("Child: ",__childArray.value); 

http://jsfiddle.net/pNtJJ/

하지만 당신은 다른 개체 것을 객체를 변경하는 경우, 원래 알아 내려고 노력했다 질문, 예를 취소 참조하는 경우, 변경 사항은 참조가 정확히 하나의 객체에서 다른 객체로의 링크이기 때문에이를 관찰하는 방법에 상관없이 다시 적용됩니다.

참고로 변수 이름에는 "array"라는 단어가 있지만 작업중인 배열이 아니라 객체입니다. 배열은 일반적으로 대괄호 [1, 2, 3, 4]으로 만들어지며 키 - 값 쌍이 아닌 값만 포함합니다.

+0

알아, 배열 이름 오해의 소지가있다. 변수 이름을 정리하지 않은 것에 대해 사과드립니다. JSHint를 사용하고 구문 문제를보고하지 않는 코드 킷을 사용합니다. 어떤 구문 오류가 발생 했습니까? 답변을위한 Thx! – Gurnzbot

+1

여기에는 하나의 구문 오류 만있었습니다 :'console.log ("Child :", __ childArray));'. 길잃은 대괄호가 있습니다. 나는 JSLint가 [즉시 호출되는 함수 표현] (괄호 안의)에 대해 불평 할 것이라고 생각하지만, 기술적으로 구문 오류는 아닙니다. – JLRishe