2011-04-28 6 views
2

내 문제는 간단합니다.하지만 간단한 해결책을 찾지 못했습니다. ..JavaScript 전달 변수가 값으로 참조되지 않음

var obj1 = { 
    m1:"a", 
    m2:"b" 
}; 

var obj2 = { 
    m:obj1 
}; 


obj2.m.m1 = "c"; 


document.write(obj2.m.m1+"<br>"); //output: c 

document.write(obj1.m1+"<br>"); // output: c (I wanted to be a) 

그래서 내가 "A"obj1.m1에서 반환해야 할 다음은 예입니다? 이 사용 될 수 있습니다 사전

+0

가능한 중복 (http://stackoverflow.com/questions/5823870/javascript-how-to-create-reference) – Quentin

+0

@ 데이비드 Dorwad 실제로 내가 찾고 있어요 맞은 것. 어떻게 가치없는 물건을 가치관으로 전달할 것인가? –

답변

6

obj2.mobj1이 아닌 obj1의 클론으로 설정해야합니다. 예 :

function clone(obj) { 
    var result = {}; 
    for (var key in obj) { 
     result[key] = obj[key]; 
    } 
    return result; 
} 

var obj2 = { 
    m: clone(obj1) 
}; 

obj2.m.m1 = "c"; // does not affect obj1.m1 
+0

필자는 특별히'clone' 함수를'Object.prototype'에 첨부하고 있습니다. 일반적으로, 아주 나쁜 생각. 또한 이것은 매우 간단한 복제 기능 구현입니다. 더 완전한 것을 원한다면, jQuery.extend의 ​​구현을 확인하십시오. –

4
+0

이것은 훌륭한 기사이며, 공유해 주셔서 감사합니다! – Andre

+3

'Object' 객체를 보완하는 것은 매우 나쁜 생각입니다. 왜냐하면 프로토 타입을 필터링하는 것을 꼼꼼하게하지 않는 한'for for'를 사용하지 않기 때문입니다. 참조 : http://erik.eae.net/archives/2005/06/06/22.13.54/ –

1

obj1같은 객체에 obj2.m 점. 가질 수 없음 obj1.m1 != obj2.m.m1

obj1의 복사본을에 할당 할 수 있습니다. 윌 게시 링크를 참조하십시오.

0

먼저 복제해야합니다.

Object.prototype.clone = function() { 
    var newObj = (this instanceof Array) ? [] : {}; 
    for (i in this) { 
    if (i == 'clone') continue; 
    if (this[i] && typeof this[i] == "object") { 
     newObj[i] = this[i].clone(); 
    } else newObj[i] = this[i] 
    } return newObj; 
}; 

var obj1={ m1:"a", m2:"b" }; 
var obj2={ m: {}}; 
obj2.m = obj1.clone(); 
obj2.m.m1="c"; 
document.write(obj2.m.m1+"<br>"); 
document.write(obj1.m1+"<br>"); 
[참조를 만드는 방법 자바 스크립트]의
관련 문제