◆ JavaScriptの布教記事です

クラスがわかるようになりました?

まず JavaScriptはオブジェクト指向ができる言語です
ですが よくある「クラスベース」じゃなくて「プロトタイプベース」です
クラスというものはありません


私が最初に使った言語は オブジェクトなんて存在しないC言語でした
それからしばらくして C++を使ってみましたが クラスとかオブジェクトとか意味不明で とりあえず 出力が簡単だったり 関数のオーバーロードができるとかちょっと便利なCくらいの使い方でした

よくわからないし GUIが手軽に使えるらしい C#にでも手を出してみようかと使ってみると 全部クラスのメソッドで関数がないと すごくJavaJavaしてました
Javaは 型が厳しすぎるとか コード量がムダに長いとか色々敬遠理由はありましたが それ以前にクラスがよくわからず苦手なのに 全部がクラスとか嫌 というかムリ と避けていたのに Cという名前がついてるC#がCからC++程度の変化じゃなくて JavaにちょっとC加えたようなものでショックでした
けどまぁVSの力もあって あんまりクラスとか考えずに 簡単なGUIソフトはできました

でも結局クラスがよくわかってないです
利点も考え方もなんかあいまいでいまいちです

そんな中web系に手を出して PHPとJavaScriptを使いました
PHPもJavaScriptも本当にスクリプトって感じでmain関数もなくシンプルです
JavaScriptは イベントとか最初はよくわからなかったですが PHPは本当に やりたいことを上から順に書いていくだけで簡単に関数すら定義しなくても ちょっとしたものなら作れてしまいます
PHPでもクラスは使えるみたいでしたが 無くて困んないしと 数千行?程度のもの作る時も関数だけでやっていました

JavaScriptも基本部分がわかると 関数の扱いが自由ですごく使いやすい言語でした
オブジェクトも最初はただの連想配列って感じでしたけど プロトタイプチェーンや 基本的に全部オブジェクトというのがわかってくると 深い部分もいろいろとわかるようになってきました

クラスでよく使われる new の動きもわかってくると クラスがどういうものかわかるようになってきました
JavaScript で単純にオブジェクトを作って返す関数を実行するのと同じようなもので 最初に宣言した決まった型のオブジェクトが返って来て どれのインスタンスというのがちゃんと決まっているもの
JavaScriptだと ただのオブジェクトで関数内で代入されたプロパティだけが入っていて if文があれば入ってるかすら不定なのが 絶対にプロパティがあって どれのインスタンスかが型としてキッチリとなってるもの さらにプロパティ(メンバ変数)とメソッドが別物になっている みたいなところですね

関数が自由なオブジェクト生成器なJavaScriptに対して キッチリとしたオブジェクトを生成して「私が製造しました」マークがつけられていて それが重視されるのがクラスって感じでしょうか

クラスベースな言語でも プレーンなオブジェクトを作れて関数を変数に入れることができれば JavaScriptみたいなことをできるんじゃないかと思います
プロトタイプチェーンのような機能がなければ インスタンスごとにメソッドを作って代入になるのでメモリのムダが大きそうですけど

わかりづらかったかもしれないですが というかたぶん分かる人はそうはいないんじゃないかって思いますけど こんな感じで プロトタイプベースな言語のおかげでクラスというのがなんとなくわかるようになりました


わざわざ 静的型付け やキッチリとしたクラスというものがあって使い方を制限されてるほうが バグや作る人による書き方の違いも減って 大規模・大人数で作るのには向いてるというのはありそうです
でも 私は自由すぎるくらいがちょうどいいんですよね

関数型言語がわかるようになりました?

JavaScriptって一部では関数型っていわれるほど 関数の扱いが自由すぎます
変数にいれることはもちろん 関数の引数にも渡せますし 返り値として受け取ってそのまま実行もできます
他のオブジェクトと同じもので ただ 「()」 をつければ「実行」ができる だけの違いです

一般に関数型言語っていうと LispやHaskellみたいな独特な文法に始まり意味不明な理論や数学的な難しそうなのが色々ありますよね
ラムダ?なにそれ FFの外伝の主人公だっけ?ブレイブルーのロボ娘?

ですが JavaScriptでは Cに近くて手続き型のわかりやすい書き方で関数型ぽいことができます
いきなり いかにも関数型な言語の入門と書かれたページや本を見ても そっとタブや本を閉じる人でも JavaScriptをそこそこに経験してると 「あ これJavaScriptでも使ってるやつだ」「この言語だとこうするのかぁ」と言った感じで簡単に入れるわけです

JavaScriptでも 関数を引数に渡して その関数がどこかで実行されたり 関数を作って返す関数を実行して 返り値をそのまま実行して……といった fnFactory()()()() みたいな書き方は最初はなにこれ と思うと思いますが 関数型関数型してる言語で見るよりは理解しやすいはずです

関数型(っというよりHaskellの特徴?)のモナドというのはjQueryと言ってる人がいました
英語だったので詳しく見てないのとHaskellユーザじゃないのでまずモナドがわかってないです(モナコ?もこな?モナリザ?みたいな単語がふわふわ脳内にあるレベル)
とりあえず JavaScript の仕組みやJavaScriptでの考え方はあらゆるところに応用できる(されてる?)みたいです

まとめ

Cみたいな手続き型に始まって プロトタイプベースオブジェクト指向 それらしく振る舞うだけならクラスベースオブジェクト指向 さらに関数型 な色々な使い方ができる素晴らしい言語ですよね

JavaScript自体のコア機能は シンプルで基本的なことしかできないのに組み合わせるとすごく複雑なことも出来ますし Ecma5, 6ではできることが一気に増えます
さらに 少し前からは ブラウザだけじゃなくて サーバサイドやデータベースを扱う言語にもなっています
サーバ用途にしなくても ローカル環境でブラウザより高速にJavaScriptで何かしたいって時には 使うことが出来ます
PHPのコマンドラインから使うような感じです

一応 Windowsにもデフォルトでブラウザじゃなく JavaScriptを動かす機能があったりします
サクラエディタの拡張機能のように ソフトの拡張機能にJavaScriptが使えるものも多いです
また 最近だとnw.jsやelectronというのを使えば HTMLとCSSとJavaScriptでローカルのソフトを作ることもできます

誰かが JSは最高だぜ と言っていたのもわかります (たぶん別のこと)