(define -ayalog '())

括弧に魅せられて道を外した名前のないプログラマ

開眼!JavaScriptを読んだ。

薄い本なので、さくっと読めました。

とりあえず、どういう本かというと

JavaScriptデザインパターンや、JavaScriptによるオブジェクト指向プログラミングの本ではありません。良いJavaScriptの特徴を悪い特徴と区別しているものでもありません。JavaScriptの完全なリファレンスガイドでもありません。プログラミングの超初心者の本でもなく、JavaScriptを全く知らない人のための本でもありません。レシピ満載のクックブックでもありません。これらの本はすでに存在します。
本書の目的は、JavaScriptにおけるオブジェクトをはじめとするさまざまな要素、たとえばオブジェクトそのものやプリミティブ値、スコープ、継承、グローバルオブジェクトなどを考えることによって、JavaScriptの正確な世界観を提供することです。本書はJavaScriptのオブジェクトの性質について焦点を当てており、ECMA-262 Edition3標準の簡潔かつ消化可能な要約でもあります。
- 開眼!JavaScript

まぁそんな感じです。えー、正直もにょる感じのところもあります。あります、というかありました。個人的に前半(3分の1くらい)は読み飛ばしてしまっていい気はするのですが、ちゃんと読みました。一応知っておくと良さそうな内容ではあったので。

目次紹介しておくと、こんな感じ。

1章 JavaScriptオブジェクト
2章 オブジェクトとプロパティを扱う
3章 オブジェクト(Object())
4章 関数(Function())
5章 グローバルオブジェクト
6章 this
7章 スコープとクロージャ
8章 関数のprototypeプロパティ
9章 配列(Array())
10章 String()
11章 Number()
12章 Boolean()
13章 プリミティブ型文字列、数値、真偽値
14章 null
15章 undefined
16章 Math関数
付録A レビュー
付録B 終わりに

4章くらいからようやく面白いかなーって本です。けど、オブジェクトの話は大事です。大事だけど退屈です。9章あたりからもちょっと退屈です。


言語仕様で面白すぎるのがBooleanコンストラクタで、これがヒドい。ヒドすぎて笑います。

var boolValue = new Boolean(false);
console.log(boolValue.toString()); // => false

if(boolValue){
  console.log('true');
}else{
  console.log('false');
}
// => true

あれ?みたいなw
JavaScriptはfalsy valueつってfalseになりうる値が決まっていて、この時boolValueはオブジェクトだからtrueになるらしいんだけど、面白すぎて思わず笑いました。ちなみにnew付けないでBooleanコンストラクタは使うのが良いぽい。その方がオブジェクトを生成しないでプリミティブのbooleanを返すから。

あとは普通にクロージャの話とか為になる。「クロージャってこう書くんだよ!」ってのは皆教えてくれるけど、「なんでそういうことが出来るのか」的な話は誰もしてくれないので、凄く為になる。良い。スコープチェーンとかプロトタイプチェーンの話もいいね。プロトタイプチェーンに至っては図解で綺麗に説明してあるので初心者でも安心。

まぁそれは良いんだけど、コンストラクタ関数ってそんなに使うのかなっていうのが正直なとこだったりします。延々とコンストラクタ関数を説明しようとするのがこの本最大のもにょりポイント。そういうクラスベースな他の言語のまね事する必要あるのかー的な。JavaScriptのnewが嫌いなのでnew使いたくないというか。JavaScript: The Good PartsにあったObject.createなプロトタイプ継承の方がシンプルだしいい気がする。

だってnewいらないし、こんな感じで書いたほうがJavaScriptらしいんじゃないの?例はCoffeeで書いてるし、Coffeeはclassキーワードあるけど…。

#bookというオブジェクトのひな形を作っておく
book =
  title: ''
  author: ''

#bookオブジェクトをプロトタイプ継承したclean_codeオブジェクトを作る
clean_code = Object.create(book)
console.log clean_code #=> Object {title: "", author: ""} 

#clean_codeオブジェクトに値を埋める(いちいち書くのがめんどいならtitleとauthorを受け取る初期化関数みたいなのを書いておくといいです)
clean_code.title = 'Clean Code'
clean_code.author = 'Robert C. Martin'
console.log clean_code #=> Object {title: "Clean Code", author: "Robert C. Martin"} 

#新しくbookオブジェクトにpriceというプロパティが欲しくなるので追加する
#ついでに税込み価格を計算する関数も追加する。
book.price = 5000
book.tax_included_price = () ->
  @price * 1.08

#bookオブジェクトをプロトタイプ継承しているのでclean_codeオブジェクトでもpriceプロパティと税込み価格を計算する関数が使えるようになる
console.log clean_code #=> Object {title: "Clean Code", author: "Robert C. Martin", price: 5000, tax_included_price: function}
console.log clean_code.tax_included_price() #=> 5400

とまぁ、そういうもにょりポイントはあるけれど、一応読んでおくといい本だと思います。サイ本を最初から最後まで読むよりは余程マシなんだけど、ここまで勉強したらそろそろ最新の言語仕様とかそっちも勉強しないといけない気がしてきた。><

そんな感じでJavaScript奥が深いです。