オライリー矢野様より献本御礼。

待ってました!

これこそ、モダンなJavaScript。

JavaScript: The Good Parts」が「JavaScriptかくあるべき」という一冊なら、こちらは「JavaScriptこう書くべき」という一冊。プロJavaScripters、必携。

本書「JavaScriptパターン」は、「なんでもあり」であるがゆえに「なにがなんだかわからなかった」JavaScriptの世界を「かたづけてくれる」一冊。

内容紹介
JavaScriptについては一通りマスターした中上級者がさらに上を目指すための高度でかつ有用なテクニックを盛り込んでいます。

というのは正しいけれど、出来ればそれよりも少し早めに取りかかって欲しい。「Head First JavaScript」の次あたりには。

アンチパターンを繰り返して欲しくないから。

目次 - O'Reilly Japan - JavaScriptパターンより
まえがき
1章 はじめに
1.1 パターン
1.2 JavaScriptの概念
1.3 ECMAScript 5
1.4 JSLint
1.5 コンソール
2章 必須パターン
2.1 保守しやすいコードを書く
2.2 グローバル変数の使用を最小にする
2.3 forループ
2.4 for-inループ
2.5 組み込みプロトタイプを拡張(しない)
2.6 switchパターン
2.7 暗黙の型変換を避ける
2.8 parseInt()による数値変換
2.9 コーディングの作法
2.10 命名の作法
2.11 コメントを書く
2.12 APIのドキュメントを書く
2.13 読み手を考えて書く
2.14 ピアレビュー
2.15 プロダクション段階でミニファイする
2.16 JSLintを実行する
2.17 まとめ
3章 リテラルとコンストラクタ
3.1 オブジェクトリテラル
3.2 カスタムのコンストラクタ関数
3.3 newを強制するパターン
3.4 配列リテラル
3.5 JSON
3.6 正規表現リテラル
3.7 プリミティブのラッパー
3.8 エラーオブジェクト
3.9 まとめ
4章 関数
4.1 背景
4.2 コールバックパターン
4.3 関数を返す
4.4 自己定義関数
4.5 即時関数
4.6 即時オブジェクト初期化
4.7 初期化時分岐
4.8 関数プロパティによるメモ化パターン
4.9 設定オブジェクト
4.10 カリー化
4.11 まとめ
5章 オブジェクト作成のパターン
5.1 名前空間パターン
5.2 依存関係の宣言
5.3 プライベートなプロパティとメソッド
5.4 モジュールパターン
5.5 サンドボックスパターン
5.6 静的メンバ
5.7 オブジェクト定数
5.8 連鎖パターン
5.9 method()メソッド
5.10 まとめ
6章 コード再利用パターン
6.1 クラシカルとモダンの継承パターン対決
6.2 クラシカルな継承を使ったとき期待される結果
6.3 クラシカルなパターンその1:デフォルトパターン
6.4 クラシカルなパターンその2:コンストラクタ拝借
6.5 クラシカルなパターンその3:プロトタイプを拝借して設定する
6.6 クラシカルなパターンその4:プロトタイプを共有する
6.7 クラシカルなパターンその5:一時的コンストラクタ
6.8 Klass
6.9 プロトタイプによる継承
6.10 プロパティのコピーによる継承
6.11 ミックスイン
6.12 メソッドを拝借する
6.13 まとめ
7章 デザインパターン
7.1 シングルトン
7.2 ファクトリ
7.3 イテレータ
7.4 デコレータ
7.5 ストラテジー
7.6 ファサード
7.7 プロキシ
7.8 メディエータ
7.9 オブザーバ
7.10 まとめ
8章 DOMとブラウザのパターン
8.1 関心の分離
8.2 DOMスクリプティング
8.3 イベント
8.4 実行時間が長いスクリプト
8.5 リモートスクリプティング
8.6 JavaScriptの配備
8.7 読み込みのための戦略
8.8 まとめ
索引

例えば、グローバル変数をどうするか。

ご存知のとおり、JavaScriptではvarを付けない限りそれはグローバル変数になる。そのあたりはさんざん「JavaScript: The Good Parts」で Douglas Crockford も Dis っていることではあるけれど、普及してしまったものは仕方がない。Perlだってuse strict;が普及するまでだいぶ時間がかかったし、そして ECMAScript 5 が"use strict";をもたらすのはこれからだ。

とりあえずvarをつけまくるのはいいとして、グローバル変数を明示的に使うにはどうしたものか。windowで代用する?ブラウザーはよくてもnode.jsとかはそうは行かない。

var global = (function(){ return this; })();

いい線行ってる。しかしこれは"use strict";ではうまく行かない。ではどうする?

こうすればいい。

(function(global){

var foo = 1,
    bar = 2,
    // …
/* more lines of codes */

})(this);

jQueryなども、もちろんこうしている。

本書にはこうした「こんなときどうする」というパターンがいくつも出てくる。これらのパターンは昨日今日出て来たのではなく、第一線の JavaScripters が試行錯誤した結果獲得したものだ。知らなくても動くコードは書けるだろう。しかし知っているのと知らないのでは、書きやすさと書き直しやすさ、とくに後者が断然違う。パターンは車輪より再発明しにくいことを考えれば、中上級者になるのを待たずに身につけた方がいい。

これから JavaScript を習う人たちが本当うらやましい。まだDOMもなかった頃からやっていた人たちがそれでどれほど苦しみ、そしてどれほどJavaScriptを誤解したことか。とはいえ、それは実用言語がいずれも通って来た道でもある。はじめから道をつけようとした言語はまず成功しない。Pythonでさえその例外ではないことは、「言語設計者たちが考えること」を読めばわかる。道があるから人が通るのではない。人が通ったところが道になるのだ。

通るなら、この道を。

Dan the Good Old JavaScripter