2016-08-04 14 views
0

オブジェクトは参照によって渡されます。 私は以下のようにモジュールパターンを実装しました。javascriptモジュールパターンreturnオブジェクトリファレンス?

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 syntax errors – Tushar

答えて

5

:この一緒に行くことになりましたか?

あなたはobj変数への新しい参照を代入しているが、それはあなたのconsoleコードが見ているものではありません。返すオブジェクトのobjプロパティの参照を見ています。

myModule.objは内部obj varへの参照ではありませんか?変数とプロパティとの間のリンクが存在しないその後

return { 
    obj: obj 
    // ... 
} 

コピープロパティに変数からオブジェクト参照、この

号。あなたのCALLTO updateObj前に、ここであなたは(省略いくつかの無関係な内容で)メモリに持っているものだ

あなたがmyModuleを作成した後、:

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

Ref11235がへのオブジェクト参照の値のためだけplaeholderですそのオブジェクト。 (同様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

問題は、内のobjは、モジュール内で定義されている変数objを参照していないことです。同じobjmyModuleと同じにするには、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

この1つは、以下のコードに似ている:

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

あなたがBにあなたのリンクを失っているa={some:1}、行の原因が動作しないこと。
それは意味をなさないことを願っています!

関連する問題