質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
JavaScript

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

Q&A

解決済

1回答

1805閲覧

Javascriptの書き方(モジュール・パターンとオブジェクト・リテラル?)

tampopopofu

総合スコア22

JavaScript

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

0グッド

0クリップ

投稿2015/05/23 08:06

Javascriptの書き方(モジュール・パターン)での派生質問となります。
これの続きとしてお読みいただければ幸いです。

下記のようなJavaScriptコードがあります。
func.js

lang

1(function() { 2 var Logo = (function () { 3 function _push() { 4 console.log('Push!!'); 5 return { 6 show: _show, 7 hide: _hide 8 }; 9 } 10 function _show() { 11 // `Logo.push().show()`実行時のコード 12 console.log('Show!!'); 13 } 14 function _hide() { 15 // `Logo.push().hide()`実行時のコード 16 console.log('Hide!!'); 17 } 18 19 return { 20 push: _push 21 }; 22 }()); 23 24 $(document).ready(function() { 25 $('#logo').on('click', function() { 26 Logo.push().show(); 27 }); 28 }); 29}());

Logoを大項目、pushを中分類として、その中にshowとhideという処理を
呼び出したい場合の書き方をご教示ください。

上記の例で言いますと、
・Logo.push().show();
と呼び出すと、「Push!!」と「Show!!」が交互に2回ずつ出力されます。
これを1回だけにしたいです。

・Logo.push.show();
というような呼び出し方を実現したいです。

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

前回の質問から飛んできました。

上記の例で言いますと、
・Logo.push().show();
と呼び出すと、「Push!!」と「Show!!」が交互に2回ずつ出力されます。
これを1回だけにしたいです。

凄く分かりにくいのですが、前回の質問でのやりとりから、「Logo.push().show()実行時に『Push!!』と『Show!!』が出てしまい、これを『Show!!』のみ出るようにしたい」ものであると解釈します。

lang

1/** 2 * この質問は、以下の要件を求めるものと仮定します 3 */ 4 5Logo.push(); 6// Push!! 7 8Logo.push().show(); 9// Push!! <-出したくない 10// Show!! 11 12Logo.push().hide(); 13// Push!! <-出したくない 14// Hide!!

コメントでも書いたとおり、これはLogo.push()を実行したうえで、その返り値にshowメソッドが含まれているためこうなってしまいます。

lang

1Logo.push().show(); 2// Push!! 3// Show!! 4 5/** 6 * 上の記述は、以下の処理と同等です 7 */ 8 9var Logo_push = Logo.push(); 10// Push!! 11Logo_push.show(); 12// Show!! 13 14/** 15 * 一旦`Logo.push`を実行してしまうので、 16 * どうしても中分類`Logo.push`の処理である「Push!!」が出てしまいます 17 */

Logo.push()を実行せず、また記述を殆ど変えない方法として、Logo.pushのプロパティとしてshowメソッドを定義し、Logo.push.show()のように記述する方法があります。
これを実装したコードは以下になります。

lang

1var Logo = (function () { 2 function _push() { 3 // `Logo.push()`実行時のコード 4 console.log('Push!!'); 5 } 6 function _show() { 7 // `Logo.push.show()`実行時のコード 8 console.log('Show!!'); 9 } 10 function _hide() { 11 // `Logo.push.hide()`実行時のコード 12 console.log('Hide!!'); 13 } 14 15 // _push関数(`Logo.push`)の返り値ではなく、_push関数そのものにshowとhideを定義する 16 _push.show = _show; 17 _push.hide = _hide; 18 19 return { 20 push: _push 21 }; 22}());

これで、「Show!!」のみ出す事が可能になります。

lang

1Logo.push(); 2// Push!! 3 4Logo.push.show(); 5// Show!! 6 7Logo.push.hide(); 8// Hide!!

なお、このコードではLogo.push().show()のようには記述できません。

余談ですが、私の書いた現在のコードでは中分類であるLogo.pushと小分類であるLogo.push.showの処理を記述した関数名が、_push_showという同じような名前になってしまっています。

lang

1var Logo = (function () { 2 function _push() { // 中分類の関数 3 // `Logo.push()`実行時のコード 4 console.log('Push!!'); 5 } 6 function _show() { // 小分類の関数 …関数名で区別しずらく、分かりにくい 7 // `Logo.push.show()`実行時のコード 8 console.log('Show!!'); 9 } 10 function _hide() { // 小分類の関数 …同上。分かりにくい 11 // `Logo.push.hide()`実行時のコード 12 console.log('Hide!!'); 13 } 14 15 // _push関数(`Logo.push`)の返り値ではなく、_push関数そのものにshowとhideを定義する 16 _push.show = _show; 17 _push.hide = _hide; 18 19 return { 20 push: _push 21 }; 22}());

分かりやすい関数名にした方がいいでしょう。
(この提案は、デザインパターンの一般論等ではなく、私の個人的意見です)

lang

1var Logo = (function () { 2 function _push() { // 中分類の関数 3 // `Logo.push()`実行時のコード 4 console.log('Push!!'); 5 } 6 function _push_show() { // 小分類の関数 …分かりやすい 7 // `Logo.push.show()`実行時のコード 8 console.log('Show!!'); 9 } 10 function _push_hide() { // 小分類の関数 …分かりやすい 11 // `Logo.push.hide()`実行時のコード 12 console.log('Hide!!'); 13 } 14 15 // _push関数(`Logo.push`)の返り値ではなく、_push関数そのものにshowとhideを定義する 16 _push.show = _push_show; 17 _push.hide = _push_hide; 18 19 return { 20 push: _push 21 }; 22}());

投稿2015/05/23 11:02

sounisi5011

総合スコア697

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sounisi5011

2015/05/23 11:08

前回の解答でいい忘れていましたが、私はJavaScriptのデザインパターンなどについては詳しくありません。 回答のコードは、JavaScriptのモジュール・パターンを実装したコードとして不適当である可能性があります。
tampopopofu

2015/05/23 12:02

前回に引き続きありがとうございます! 本当に素晴らしい回答と補足説明ありがとうございます。 そして、質問が曖昧で申し訳ありません。 お陰様でスッキリと理解できました。 > _push関数(`Logo.push`)の返り値ではなく、_push関数そのものにshowとhideを定義する これですね。このような理論的な考えまでに至らない自分の知識不足を実感しました。 なぜ、コンソールに同じものが2回も出力されるのかが、なんとなくでしか 分かっていませんでした。 sounisi5011さんの解説付きの回答で理解できました。 二度もご丁寧な回答ありがとうございました。
tampopopofu

2015/05/23 12:05

言い忘れました。 関数名も分かりやすいほうを使用していきます。 すごく納得しましたし、今後のためにもです。
tampopopofu

2015/05/23 12:56

修正して試しているところですが、どうも「Show!!」がコンソールに2回続けて出力されてしまっています。 クリックイベントで1回しか実行してないのにです。 まだ書き方の問題で何かあるのでしょうね。 ちょっと引き続き探っていきます。
tampopopofu

2015/05/24 00:50

上記の > 「Show!!」がコンソールに2回続けて出力 は、こちらのミスによるものです。 申し訳ありません。 まだ完全に把握はしておりませんが、恐らくテンプレートの関係で JavaScriptが2回読み込まれ、クリックイベントも2回登録されているためだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問