2016-08-04 2 views
0

내 이해는 객체가 참조로 전달된다는 것입니다. 다음과 같이 모듈 패턴을 구현했습니다.자바 스크립트 모듈 패턴 반환 객체 참조?

var myModule = (function(){ 
    var obj = {}; 

    return { 
     obj: obj, 
     updateObj: function(newObj) { 
      obj = newObj; 
     } 
    } 

}()) 

myModule.obj; // {} 
myModule.updateObj({foo:'bar'}); 
myModule.obj; // still {} :(

어디로 잘못 가고 있습니까? myModule.obj가 내부 obj var에 대한 참조가 아닌가요?

편집 :

var myModule = (function(){ 

    var public = { 
     obj: {}, 
     updateObj: function(newObj) { 
      public.obj = newObj; 
     } 
    } 

    return public; 

}()) 
+0

내가 잘못 생각했을 수도 있지만 빠른보기에서 괄호가 꺼져있을 수 있습니다. '(function() {...})()이되어서는 안됩니까? –

+0

어딘가에'예기치 않은 토큰}'에 구문 오류가 있습니다. –

+1

@SpencerWieczorek 예, 'obj = newObj', 여기 쉼표는';'이어야합니다. _Ignoring 구문 errors_ – Tushar

답변

5

가 어디 잘못 갈거야이 함께가는 끝났다?

당신은 obj변수에 새로운 참조를 할당하고,하지만 당신의 console 코드가 무엇을 바라보고 있는지 아니다. 반환하려는 객체의 obj속성의 참조를 찾고 있습니다.

myModule.objobj var에 대한 참조가 아닙니까?

이 번호 :

return { 
    obj: obj 
    // ... 
} 

복사 변수 및 속성 사이에 링크가없는 그 후에 재산 변수로부터 오브젝트 레퍼런스.

 
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
| +−−−−−−−−−−−−−−−−−−−+          | 
+−>| execution context |          | 
    +−−−−−−−−−−−−−−−−−−−+          | 
    | obj: Ref11235  |−−−−−+        | 
    +−−−−−−−−−−−−−−−−−−−+  |        | 
           | +−−−−−−−−+     | 
    +−−−−−−−−−−−−−−−−−−−−−+ +−−>| object |     | 
    | variable "myModule" | | +−−−−−−−−+     | 
    +−−−−−−−−−−−−−−−−−−−−−+ |        | 
    | obj: Ref11235  |−−−+ +−−−−−−−−−−−−−−−−−−−−−−−+ | 
    | updateObj: Ref88452 |−−−−−−>| function    | | 
    +−−−−−−−−−−−−−−−−−−−−−+  +−−−−−−−−−−−−−−−−−−−−−−−+ | 
            | environment: Ref71423 |−−−+ 
            | [[code]    | 
            +−−−−−−−−−−−−−−−−−−−−−−−+ 

Ref11235이 객체 참조의 값에 대한 단지 plaeholder입니다 : 당신이 (생략 일부 관련이없는 세부 사항) 메모리에 무엇을 당신이 당신의 CALLTO updateObj 전에 myModule을 만든 후

, 여기에 그 대상. (유사 Ref88452 함수에 대한 개체 참조이고 Ref71423는 배후 "EnvironmentRecord"는 updateObj 기능하므로 그 환경의 obj 변수를 갱신 할 수에 대한 참조가 객체에 객체 참조.)

updateObj에 전화, 당신은 myModuleobj 속성에 대한 참조를 변경했습니다,하지만 그건 obj 변수에 참조 변경되지 않습니다있는 지금,

 
+−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−+ 
|        +−−−−−−−−+     | 
| +−−−−−−−−−−−−−−−−−−−+  +−−>| object |     | 
+−>| execution context |  | +−−−−−−−−+     | 
    +−−−−−−−−−−−−−−−−−−−+  |        | 
    | obj: Ref11235  |−−−−−+ +−−−−−−−−−−−−+    | 
    +−−−−−−−−−−−−−−−−−−−+   | object |    | 
           +−−>+−−−−−−−−−−−−+    | 
    +−−−−−−−−−−−−−−−−−−−−−+ | | foo: "bar" |    | 
    | variable "myModule" | | +−−−−−−−−−−−−+    | 
    +−−−−−−−−−−−−−−−−−−−−−+ |        | 
    | obj: Ref65243  |−−−+ +−−−−−−−−−−−−−−−−−−−−−−−+ | 
    | updateObj: Ref88452 |−−−−−−>| function    | | 
    +−−−−−−−−−−−−−−−−−−−−−+  +−−−−−−−−−−−−−−−−−−−−−−−+ | 
            | environment: Ref71123 |−−−+ 
            | [[code]    | 
            +−−−−−−−−−−−−−−−−−−−−−−−+ 

유일한 변화는 myModule.obj의 값을 새로운 객체를 나타냅니다.


대신 재산 업데이트 할 updateObj을 변경하는 경우 :

updateObj: function(newObj) { 
    this.obj = newObj; 
} 

을 ... 당신은 당신이 기대하는 결과를 볼 수 있습니다. (어떤 점에서 obj 변수를 완전히 제거하는 것이 합리적 일 수 있습니다.)

+1

Vote + 1입니다. 어떻게 그걸 만들었 니? – Tushar

+0

@Tushar : 텍스트 편집기. '-'와'+'를 정렬하는 비법이 있습니다. ;-) –

+0

나는 약간의 충돌이있다 .. 굉장한 내부 설명과 'this'를 사용하여 해결 .. @ ivan-schmidt의 답이 간결 범주에서 이긴다 –

3

문제는 내부 updateObjobj 모듈 내에 정의되는 obj 변수를 참조하지 않는다는 것이다. 과 동일한 obj을 참조하려면 this 문맥을 사용하십시오.

this.obj = newObj; 

var myModule = (function() { 
 
    var obj = {}; 
 

 
    return { 
 
     obj: obj, 
 
     updateObj: function (newObj) { 
 
      this.obj = newObj; 
 
     } 
 
    }; 
 
}()); 
 

 
console.log(myModule.obj); 
 
myModule.updateObj({ 
 
    foo: 'bar' 
 
}); 
 
console.log(myModule.obj);

2

내부 OBJ var에 대한 참조를 myModule.obj 아닌가요?

아니요, 아닙니다.

var obj = {};은 개체를 만들고이 개체에 대한 참조를 obj 값으로 할당합니다.

obj: obj은 다른 개체의 obj 속성에 obj (즉, 참조)의 값을 복사합니다.

obj = newObj은 새 개체에 대한 참조로 obj 값을 덮어 씁니다. 이 속성은 obj 속성을 건드리지 않으므로 여전히 첫 번째 개체에 대한 참조입니다.

+0

그게 내가 생각할 수있는 일이다 ... obj = newObj '덮어 쓰기/대체 중입니다. –

0

메모리에 개체가 있고이 개체의 주소가 있습니다. 변수 obj에 수신 할 주소가 있습니다. 변수 objobj 속성에 할당하면 주소를 할당합니다. 그런 다음 다른 개체에 obj 변수의 주소를 덮어 쓰지 만 obj 속성 주소는 여전히 동일합니다.

1

이 사람은 아래 코드와 유사한 :

var a = {}, b=a; 
a = {some:1}; 
alert(b.some); 

작동 당신이 나에게 당신의 연결을 잃어 가고있다 a={some:1} 라인에 해당되지 않는지를.
희망적 이군!

관련 문제