javascriptでのプログラミングを勉強しています。
グローバル変数の汚染対策として、モジュールの定義について調べて以下のようなコードを書いています。
まずモジュールを定義し、内部ではobjをpublicな変数として定義しました。その後objを書き換え、結果を出力してみました。
出力結果では、Hello.objもHello.getObj()も{"key": "newvalue"}が出力されることを期待していたのですが、Hello.getObj()は元のまま{"key": "value"}となっていてあれ??となってしまいました。
javascript
1// モジュールの定義 2var Hello = (function() { 3 var obj = {"key": "value"}; 4 var getObj = function() { 5 return obj; 6 }; 7 return {"obj": obj, "getObj": getObj}; 8}()); 9 10// publicな変数の変更 11Hello.obj = {"key": "newvalue"}; 12 13// 出力結果 14console.log(Hello.obj); // {"key": "newvalue"} 15console.log(Hello.getObj()); // {"key": "value"}
Helloモジュールのreturnでは、objが参照渡しで返されている??と思いますので、値のコピーを変更しているわけではないようです。
例えばモジュール定義の後でobjのキーを直接指定して変更すると、期待している動作になりました。
javascript
1// publicな変数の変更 2Hello.obj.key = "newvalue"; 3 4// 出力結果 5console.log(Hello.obj); // {"key": "newvalue"} 6console.log(Hello.getObj()); // {"key": "newvalue"}
ですので、最初のオブジェクトを上書きしてしまう方法では、モジュール内のobjと参照が切れてしまうということなのでしょうか??
また、参照が切れないようにobj変数をオブジェクトで上書きする方法はありますでしょうか??(setメソッドを用意すれば解決できると思いますが、イコールでオブジェクトを上書きできるように、モジュールを定義する方法があれば教えていただきたいです)
ご回答よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/28 14:44
2016/11/28 15:10 編集
2016/11/28 15:21
2016/11/29 03:51