質問編集履歴

1 プログラム部分の書式改善

zpoket

zpoket score 7

2016/11/27 23:31  投稿

javascriptのクロージャでpublicなオブジェクトを変更したい
javascriptでのプログラミングを勉強しています。
グローバル変数の汚染対策として、モジュールの定義について調べて以下のようなコードを書いています。
まずモジュールを定義し、内部ではobjをpublicな変数として定義しました。その後objを書き換え、結果を出力してみました。
出力結果では、Hello.objもHello.getObj()も{"key": "newvalue"}が出力されることを期待していたのですが、Hello.getObj()は元のまま{"key": "value"}となっていてあれ??となってしまいました。
```
``` javascript
// モジュールの定義
var Hello = (function() {
 var obj = {"key": "value"};
 var getObj = function() {
   return obj;
 };
 return {"obj": obj, "getObj": getObj};
}());
// publicな変数の変更
Hello.obj = {"key": "newvalue"};
// 出力結果
console.log(Hello.obj); // {"key": "newvalue"}
console.log(Hello.getObj()); // {"key": "value"}
```
Helloモジュールのreturnでは、objが参照渡しで返されている??と思いますので、値のコピーを変更しているわけではないようです。
例えばモジュール定義の後でobjのキーを直接指定して変更すると、期待している動作になりました。
```
``` javascript
// publicな変数の変更
Hello.obj.key = "newvalue";
// 出力結果
console.log(Hello.obj); // {"key": "newvalue"}
console.log(Hello.getObj()); // {"key": "newvalue"}
```
ですので、最初のオブジェクトを上書きしてしまう方法では、モジュール内のobjと参照が切れてしまうということなのでしょうか??
また、参照が切れないようにobj変数をオブジェクトで上書きする方法はありますでしょうか??(setメソッドを用意すれば解決できると思いますが、イコールでオブジェクトを上書きできるように、モジュールを定義する方法があれば教えていただきたいです)
ご回答よろしくお願いいたします。
  • JavaScript

    36465 questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • クロージャ

    37 questions

    クロージャは、プログラミング言語における関数オブジェクトの一種です。 引数以外の変数を実行時の環境ではなく、 自身が定義された環境において解決することを特徴とします。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る