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

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

新規登録して質問してみよう
ただいま回答率
85.48%
オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

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

Q&A

解決済

1回答

2412閲覧

JavaScriptにおけるオブジェクト指向について

poooooo

総合スコア125

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

JavaScript

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

0グッド

1クリップ

投稿2016/08/07 02:18

JavaScriptにおけるオブジェクト指向を学んでいます。
PHPにおけるオブジェクト指向は一通り学び理解しておりましたが、JavaScriptに置き換わるといまいち理解できずにいます。
現在学んでいるのは、プロトタイプ、オブザーバー、クロージャなどです。

書籍に書かれていた下記のサンプルコードを映し、動作を確認するまではできましたが、
実際どのように応用したらいいかがイメージできておりません。
このコードだけですと、引数に渡された値をlistenersに代入し、代入されたものをtriggerで実行するだけの処理という認識で合っているでしょうか?

また、実際に処理として使っていく場合は、
このサンプルコードのように(?)、

・監視
・登録
・削除
・実行

というように、処理を切り分け行ったらよいということなのでしょうか?

雑で申し訳ありませんが、ご回答いただけますと幸いです。

JavaScript

1function Observer() { 2 this.listeners = {}; 3} 4 5Observer.prototype.on = function(event, func) { 6 if(!this.listeners[event]) { 7 this.listeners[event] = []; 8 } 9 this.listeners[event].push(func); 10} 11 12Observer.prototype.off = function(event, func) { 13 var ref = this.listeners[event], len = ref.length; 14 15 for(var i = 0; i < len; i++) { 16 var listener = ref[i]; 17 if(listener === func) { 18 ref.splice(i,1); 19 } 20 } 21} 22 23Observer.prototype.trigger = function(event) { 24 console.log(event); 25 var ref = this.listeners[event]; 26 len = ref.length; 27 28 for(var i = 0; i < len; i++) { 29 var listener = ref[i]; 30 if(typeof listener === "function") { 31 listener(); 32 } 33 } 34} 35 36var observer = new Observer(); 37var greet = function () { 38 console.log("Good morning"); 39}; 40observer.on("morning", greet); 41observer.trigger("morning"); 42 43var sayEvening = function () { 44 console.log("Good evening"); 45} 46observer.on("evening", sayEvening); 47observer.trigger("evening");

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

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

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

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

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

guest

回答1

0

ベストアンサー

JavaScriptにおけるObserverパターンのユースケースについての質問という認識であっていますでしょうか?

JavaScriptではObserverパターンは頻出です、ただしそれがObserverという名前で明示的に呼ばれていないことが多いかもしれません。

例えばブラウザで動くアプリケーションを作る際に利用するjQueryは、DOM要素に対してクリックされた時に実行したい処理をonメソッドで登録します。
以下はjQueryのAPIドキュメントからの抜粋です:

js

1$( "#dataTable tbody tr" ).on( "click", function() { 2 console.log( $( this ).text() ); 3});

ここではid dataTableの子要素であるtbody trがクリックされた時にtbody trのテキストをコンソールに出力するよう設定しています。
ブラウザで動くアプリケーションのように対話型のアプリケーションを作りたい場合、Observerパターンがよく出てきます。

またサーバサイドJavaScriptのNode.jsでは処理をブロックしないように、I/O待ち等時間のかかる処理の結果をコールバックで受け取るスタイルで記述する必要があります。
いくつかあるスタイルの内でStreamと呼ばれるAPIはEventEmitter(Observerパターンを実装している)インタフェースを実装していて、やはりonメソッドで任意のイベントが発火した時の処理を登録するようになっています。
以下はNode.jsのAPIドキュメントからの抜粋です:

js

1const readable = getReadableStreamSomehow(); 2readable.on('data', (chunk) => { 3 console.log(`Received ${chunk.length} bytes of data.`); 4}); 5readable.on('end', () => { 6 console.log('There will be no more data.'); 7});

ここではReadableStreamを返却するgetReadableStreamSomehowを実行して、例えばファイル等を読み込むためのStreamを手に入れた後、Streamonメソッドでデータが来た時、データを読み終わった時の処理を登録しています。

JavaScriptは元々シングルスレッドが基本なので、なるべく処理をブロックしないようプログラムを構築する必要があり、その解決手段の一つとしてObserverパターンが多く用いられているのだと思います。

投稿2016/08/07 03:21

JunpeiTajima

総合スコア17

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

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

poooooo

2016/08/08 11:29 編集

ありがとうございます。 よく見かけるjQueryのパターンもObserverパターンなのですね。 何度も使っているのに全く気づきませんでした。大変参考になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問