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

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

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

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

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

Q&A

解決済

3回答

2499閲覧

このthisはどこを指してますか?

退会済みユーザー

退会済みユーザー

総合スコア0

Vue.js

Vue.jsは、Webアプリケーションのインターフェースを構築するためのオープンソースJavaScriptフレームワークです。

JavaScript

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

0グッド

1クリップ

投稿2018/06/21 05:03

JavaScriptとVue.jsを勉強している初学者です。
PHPのクラスやインスタンスの基礎については理解していますが、JavaScript と Vue.js については勉強中で理解が浅いです(><)

基礎から学ぶ Vue.jsという書籍にあるリストの絞り込みに利用しようのコードについて質問があります。

VueというよりはJavaScriptの知識が低くthisが何を指しているのか理解できません。
下記がコードです。

<!-- HTMLのコード --> <div id="app"> <input v-model.number="budget"> 円以下に絞り込む <input v-model.number="limit"> 件を表示 <p>{{ matched.length }} 件中 {{ limited.length }} 件を表示中</p> <ul> <!-- v-forでは最終結果、算出プロパティのlimitedを使用する --> <li v-for="item in limited" v-bind:key="item.id"> {{ item.name }} {{ item.price }}円 </li> </ul> </div> <!-- JavaScriptのコード --> new Vue({ el: '#app', data: { // フォームの入力と紐付けるデータ budget: 300, // 表示件数 limit: 2, // もとになるリスト list: [ { id: 1, name: 'りんご', price: 100 }, { id: 2, name: 'ばなな', price: 200 }, { id: 3, name: 'いちご', price: 400 }, { id: 4, name: 'おれんじ', price: 300 }, { id: 5, name: 'めろん', price: 500 } ] }, computed: { // budget以下のリストを返す算出プロパティ matched: function () { return this.list.filter(function (el) { return el.price <= this.budget }, this) }, // matchedで返ったデータをlimit件返す算出プロパティ limited: function () { return this.matched.slice(0, this.limit) } } })

matchedlimited にある this が何を指しているのか理解できません。
途中までになりますが私の中での処理の流れを順に説明します。

処理1

HTMLで v-for="item in limited" と記述しているので、limited にある配列のデータを繰り返し表示します。
最初に limited にある関数が実行されます。

処理2

limitedreturn this.matched.slice(0, this.limit) という処理をしていいます。
sliceメソッドで配列の表示件数を調整しています。初期値は limit: 2 のため2件表示されます。
返り値の中でmatchedメソッドを読んでいるため、matchedが実行されます。

処理3

matchedではfilterメソッドの第一引数にはメソッドでpricebudgetを比較して真偽値を返しています。

matched: function () { return this.list.filter(function (el) { return el.price <= this.budget }, this) },

matchedlimited にある this が何を指しているのかわからないため、ここまでしか流れがわかりません。

私の中ではVue()の引数にオプションを記述してVueのコンストラクタを実行して、インスタンスを作成して描画しているという認識です。

new Vue({ // ここにオプションを記述してVueのコンストラクタを実行 })

順番としてはVue()内に記述したコンストラクタが実行された後にインスタンスが作成されているため、オプション内に記述したthisはこのインスタンスを指しているわけではないと思うのですが、matchedlimited にある this は何を指しているのでしょうか?

this.list.filterでなぜlistの配列にアクセスできるのか、 function (el)el の仮引数になぜlistの配列が入るのか謎です(><)

thisが何を指しているのか、ご存知の方、教えてくださいm(__)m

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

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

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

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

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

guest

回答3

0

今回の質問に対する固有な回答ではありませんが、コメントを入れておきます。

JavaScriptの場合、thisは状況によって決まる以外に、Function.prototype.call()などを使うことでコードでセットすることも可能です。なので、ソースコードから想像できないものがthisになることもありえます。

投稿2018/06/21 05:25

編集2018/06/21 05:26
maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2018/06/21 06:34

なるほど、callを使うとthisの指定ができるのですね。 ありがとうございますm(__)m
guest

0

ベストアンサー

thisが何を指しているのか

↑この場合、javascriptのオブジェクト。
特に今回は、

new Vue({ // ここにオプションを記述してVueのコンストラクタを実行 })

↑Vueオブジェクト。

投稿2018/06/21 05:09

tkturbo

総合スコア5572

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

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

退会済みユーザー

退会済みユーザー

2018/06/21 06:33

あー、なるほど。Vueオブジェクトを指してると考えると this.list や this.matched の記述も納得です。 私の中では - オブジェクトとインスタンス違い(私の中では同じと捉えれてる) - なぜコンストラクタにthisと書いてオブジェクト自身を指せるのか(ブラウザの内部処理の順番) について疑問が残るので、調べてみます。 ありがとうございますm(__)m
guest

0

すでに解決済みですが、補足で回答させていただきます。

this.list.filter(コールバック, スコープ) の関数では2つ目の引数として this を渡してスコープを指定しています。引数がなければ、また違うものになります。

Array.prototype.filter()

thisの扱いについては60ページで簡単に解説していますが、他の方がおっしゃられている通り関数の書き方で複雑に変わってしまうため、ネットの記事も参考にしてみてください。

投稿2018/06/21 17:19

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2018/06/21 17:31

おお!先生だ!補足ありがとうございますm(_ _)m JavaScriptの基本的なことも理解できていないので、ネットで調べながら本を読み進めていきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問