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

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

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

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

Q&A

解決済

1回答

1395閲覧

どのように実行されるのか

aaaaaaaa

総合スコア501

JavaScript

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

0グッド

0クリップ

投稿2017/07/14 10:30

以下のjavascriptは、ブレイクスルーjavascript34頁から49頁に記載されている頁上に存在する画像をモーダルウィンドウで拡大表示するソースです。

ソースを上から読み込んでいくとコンストラクタがnewされます。実体化すると、インスタンス化時に渡した引数がModalクラスに渡され、Modalクラス内に存在するinitialize(el)が実行されます。
initialize()で、処理に使う変数が初期化され、handleEvents()が実行されイベントハンドラを設定しています。
イベントハンドラに設定したイベントが発生すればshowメソッドやnextメソッドなどが実行される。
それまでは、handleEventsメソッドで待機する。

ここで質問です。

プログラムの実行処理は、上記の内容であっておるのでしょうか。

javascript

1function Modal(el) { 2 this.initialize(el); 3} 4 5Modal.prototype.initialize = function(el) { 6 7 this.$el = el; 8 this.$container = $("#modal"); 9 this.$contents = $("#modal-contents"); 10 this.$close = $("#modal-close"); 11 this.$next = $("#modal-next"); 12 this.$prev = $("#modal-prev"); 13 this.$overlay = $("#modal-overlay"); 14 this.$window = $(window); 15 //②コンストラクタにとってthisは、インスタンス(modal)を意味しますが、下記にはthis.handleEvents()とあります。this.prototype.handleEvents()ではないということは、 16 //下記のthisは、modalのときもあるがmodal.prototypeも兼ねているということなのでしょうか。 17 this.handleEvents(); 18}; 19 20Modal.prototype.handleEvents = function() { 21 //③ほかのメソッドなどでは、thisを代入せずに使っておりますが、なぜshowメソッドではインスタンスを意味するthisをローカル変数に代入したのでしょうか。 22 //ローカル変数に格納すればhandleEvents外から接続できなくなります。show、hide、next、prevの各メソッドは、ローカル変数を使って実行されるべきメソッドだということなのでしょうか。 23 //なぜ、handleEventsメソッドだけこのような仕組みなのでしょうか。 24 var self = this; 25 26 this.$el.on("click", function(e) { 27 self.show(e); 28 return false; 29 }); 30 31 this.$close.on("click",function(e) { 32 self.hide(e); 33 return false; 34 }); 35 36 this.$overlay.on("click",function(e) { 37 self.hide(e); 38 return false; 39 }); 40 41 this.$next.on("click", function(e) { 42 self.next(e); 43 return false; 44 }); 45 46 this.$prev.on("click", function(e) { 47 self.prev(e); 48 return false; 49 }); 50}; 51 52Modal.prototype.show = function(e) { 53 54 var $target = $(e.currentTarget), 55 src=$target.attr("href"); 56 57 this.$contents.html("<img src=\"" + src +"\"/>"); 58 this.$container.fadeIn(); 59 this.$overlay.fadeIn(); 60 var index = $target.data("index"); 61 //④返り値は、関数ですが、これは 62 //this.countChange = function(num) { 63 // return index = (index(すでに受け取り済み) + num(next()、prev()が実行されれば引数が受け取れる) + len(すでに受け取り済み)) % len; 64 //}; 65 //と同じであるという認識であっておりますか。 66 this.countChange = this.createCounter(index,this.$el.length); 67 return false; 68 69}; 70 71Modal.prototype.hide = function(e) { 72 this.$container.fadeOut(); 73 this.$overlay.fadeOut(); 74}; 75 76Modal.prototype.slide = function(index) { 77 this.$contents.find("img").fadeOut({ 78 complete: function() { 79 var src = $("[data-index=\"" + index + "\"]").find("img").attr("src"); 80 $(this).attr("src",src).fadeIn(); 81 } 82 }); 83}; 84 85Modal.prototype.createCounter = function(index, len) { 86 return function(num) { 87 return index = (index + num + len) % len; 88 }; 89}; 90 91Modal.prototype.next = function() { 92 this.slide(this.countChange( 1 )); 93}; 94 95Modal.prototype.prev = function() { 96 this.slide(this.countChange( -1 )); 97}; 98 99var modal = new Modal($("#modal-thumb a")); 100//ブレイクスルーjavascript chapter2

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

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

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

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

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

guest

回答1

0

ベストアンサー

プログラムの実行処理は、上記の内容であっておるのでしょうか。

うーん…… 用語にひっかかる部分がありますが、まあ、だいたいそうですかね。

下記のthisは、modalのときもあるがmodal.prototypeも兼ねているということなのでしょうか

違います。prototype属性を持つのはFunctionだけです(たぶん)
なので、modalはprototype属性を持ちません。
おそらく、[[prototype]]と勘違いされているかと思います。prototype属性に何かを代入しても、[[prototype]]が変わるわけではありません(たぶん)
ちなみに、modal.[[prototype]]には、(たぶん)new演算子の効果により、Modal.prototypeが入っています(たぶん)

なぜ、handleEventsメソッドだけこのような仕組みなのでしょうか。

DOMイベントはthisが化けるので退避させています。
↓こちらをご参照ください。

addEventListener() を使って要素にハンドラー関数を設定したとき、ハンドラーの中の this の値は要素への参照となります。これはハンドラーに渡された event 引数の currentTarget プロパティの値と同じです。

EventTarget.addEventListener - Web API インターフェイス | MDN

④返り値は、関数ですが、これは(...)と同じであるという認識であっておりますか。

だいたいそうですね。

投稿2017/07/14 12:00

Lhankor_Mhy

総合スコア36074

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

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

aaaaaaaa

2017/07/18 10:51

ご回答ありがとうございます。大変助かりました。 ご返答のなかにあります、「prototype属性」というのは、writableやenumerableなどのjavascriptのプロパティが持つ属性(attribute)の一種でしょうか。
Lhankor_Mhy

2017/07/18 11:22

いえ、オブジェクトのprototypeプロパティのことです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問