- ベストアンサー
シングルトンコードが分からないので教えてください
リンク先JavaScriptコードで、どうして「あるクラスのオブジェクト(インスタンス)をひとつに限定」することになるのでしょうか? http://javascript.keicode.com/adv/singleton.php ・「アプリケーションの情報をグローバルに保持するオブジェクト」とは、var MyAppのことでしょうか? ・ただ一つのオブジェクト(しかもその内容がただ一つのプロパティ)をreturnすることを、シングルトンと呼ぶのでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
グローバル変数やグローバル関数を作る事ができないJavaで、擬似的にグローバル変数/関数を作る方法がシングルトンですので、 JavaScriptでは、グローバル変数の重複を避けるためにオブジェクトのプロパティやメソッドとして定義すると覚えておけば良いのではないでしょうか。 なお、JavaScriptの文法として、「オブジェクトとして生成する」というルールがありますので、(クラスではなく)オブジェクトとして作成(生成)しなければなりません。 var myApp = { x: 100, y: 20, point: 0, log: function(s){ console.log(s); } }; var myDebug = { log: function(id, s){ document.getElementById(id).value+=s; } }; // 使い方 myApp.log( 'Hello, world!' ); myDebug.log( 'textarea1', 'Hello, world!' ); myApp.log( '現在の得点は' + myApp.point + '点です' ); myDebug.log( '現在の得点は' + myApp.point ); -------------------------------- JavaScriptで参考サイトのような作り方は、 const(定数。一度定義すると変更できない変数)を擬似的に作る方法として紹介される事の方が多いです。 この作り方をアレンジしていくと、jQueryのjQuery()オブジェクトのようになりますので、 何がシングルトンで何がコンストラクタか、という「呼び方」は、JavaScriptでは考えない方が良いと思います。
その他の回答 (2)
- 神崎 渉瑠(@taloo)
- ベストアンサー率44% (1016/2280)
C++やC#などを経験されていれば、「名前空間」と言えば理解できるでしょうか。 JavaScriptでシングルトンと名前空間を実現しようとすると、同じ物になります。 クロージャーを使うと直接値を変更(代入)できない変数を作る事ができます。 (Javaで言うところのプライベート変数) 以下の3つはほぼ同じになります。 1つめの例は、myApp.point = 5; としてpointに直接代入できます。 ---------------- var myApp = { point: 0, setPoint: function(p){ this.point= p; }, getPoint: function(){ return this.point; } }; myApp.point = 5; alert( myApp.getPoint() ); ------------------- var myApp; (function(){ var point = 0; myApp = { // varを付けていないので、function(){}の外のmyAppに代入する setPoint: function(p){ point= p; }, getPoint: function(){ return point; } }; })() myApp.setPoint(5); alert( myApp.getPoint() ); -------------------- var myApp = (function(){ var point = 0; return { setPoint: function(p){ point= p; }, getPoint: function(){ return point; } }; })() myApp.setPoint(5); alert( myApp.getPoint() );
お礼
回答ありがとうございました >「名前空間」と言えば理解できるでしょうか。 >JavaScriptでシングルトンと名前空間を実現しようとすると、同じ物になります ・初めて知りました ・具体的なコード3例も提示いただき、大変参考になりましたー
- Ogre7077
- ベストアンサー率65% (170/258)
クラスのない JavaScript にとって、 クラス型オブジェクトの概念であるシングルトンなぞ無用の長物かとは思いますが... var object = {}; // これだけで唯一無二のオブジェクトが完成 提示の例を見ますと、「アクセサ/プロパティ」または「カプセル化」を実現するために クラスっぽい書き方をしているようです。 なのでクラスのインスタンスを限定するシングルトン(っぽい書き方)を どうするという話が出てくるのでしょう。 ちなみに今だと、プロパティの定義はこいつで出来ます。 https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Object/create > 「あるクラスのオブジェクト(インスタンス)をひとつに限定」 クラスでもインスタンスでもないのですが、一つのオブジェクトに限定しています。 > アプリケーションの情報をグローバルに保持するオブジェクト 変数 MyApp に格納されているオブジェクト {getName:略} > ただ一つのオブジェクトを return することを、シングルトンと呼ぶのでしょうか? そのあたりはカプセル化のための書き方なので、シングルトン(っぽい書き方)とは無関係です。
お礼
回答ありがとうございました >クラスのない JavaScript にとって、 >クラス型オブジェクトの概念であるシングルトンなぞ無用の長物かとは思いますが... ・JavaScript的にはそういう扱いなのですね ・参考になりましたー
お礼
回答ありがとうございました >グローバル変数やグローバル関数を作る事ができないJavaで、擬似的にグローバル変数/関数を作る方法がシングルトンですので、 >JavaScriptでは、グローバル変数の重複を避けるためにオブジェクトのプロパティやメソッドとして定義すると覚えておけば良いのではないでしょうか ・シングルトン自体良く分かっていないので、大変参考になりました ・JavaScript特有のパターンと言うよりは、多言語パターンを当てはめると、ぐらいの感じでしょうか? ・勉強になりましたー