コンパイラかく語りき

import { Fun } from 'programming'

JSライブラリ「Underscore.js」を読んでJavaScript中級者になる! ~コンストラクタを利用してthisの値を操作する~

どうも、chuckです。引き続き、Underscore.jsを読んでいきます。

 

chuckwebtips.hatenablog.com

 

 

今回読むのはこの箇所。

f:id:chuck0523:20150903225905p:plain

 

いやあ、Underscore.jsの目玉と言ってもいいくらいですね!_(アンダースコア)を変数定義しています。

何をしているかと言うと、objを引数にとった関数がありますね。それを_に代入しています。

 

では、関数の中身を見ていきます。

f:id:chuck0523:20150903230120p:plain

拡大。

 

1行目と2行目はif文がありますね。instanceofを使って何かを判定しています。

 

developer.mozilla.org

 

instanceof演算子は、オブジェクトが自身のプロトタイプにコンストラクタのprototypeプロパティを持っているかを確認します。

うーむ、難しい…w

 

もう一度。

f:id:chuck0523:20150903230120p:plain

1行目は、obj がプロトタイプとして、_を持っているかどうか確認してるんですよね。で、trueになれば、問題なくそれを返す。

2行目は、1行目がfalseになった場合に到達する。thisがプロトタイプとして、_を持っていないとき、new _(obj)を返す。

これ、推測なんですけど、意図的にコンストラクタ呼び出しをしてますよね???たぶん。

 

thisとコンストラクタって、どこかで勉強した気がする。

コンストラクタ呼び出しにすることで、thisの値がグローバルオブジェクトではなく、自分自身?になるんですよね?たしか。

 

確認した。

qiita.com

はい、thisにはインスタンス自身が入ります。

 

というわけで、いずれにせよ、2つのif文でチェックをしてるわけですね。そして3行目で、プロパティを新規作成して引数のobjをセットしている模様。(なぜそんな処理をしているのかは謎)

 

 

まとめ

少ないですが、今回は_(アンダースコア)変数の定義について見てみました。

単なる変数定義のようで、そこにはしっかりとプロトタイプのチェックがあって、勉強になりました。

instanceofを適切に使えるようになったら、JavaScriptエンジニアとしてかなりかっこいい感じがします。