上記の例で言いますと、
・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:08
2015/05/23 12:02
2015/05/23 12:05
2015/05/23 12:56
2015/05/24 00:50