coffee script で自動生成される__extends関数

__extends関数を整形して、コメントを追加した。
ctorオブジェクトのところを理解するのにわりと苦労した。
あとconstructorプロパティの存在を知らなかったので、なんでこれで child.__super__.constructor() が出来るのかかなり悩んでしまった。結論としては、parent.prototype.constructor()がjavascriptの仕様として存在するというものだったが。

__hasProp = {}.hasOwnProperty;
__extends = function(child, parent) {
	// parentのプロパティを、childにコピー。staticなメンバの継承用。
	for (var key in parent) {
		if (__hasProp.call(parent, key)) child[key] = parent[key];
	}

	// コンストラクタを実行しないこと以外parentと同じ、継承用parentオブジェクトを作成。
	// prototypeはparentのもので上書きするので、そのままだとprototype.constructorがparentを指してしまう。
	// それを補正するために最初にconstructorプロパティを書き変える処理を入れている
	// ctor.prototype.constructorを書き変えちゃうと一緒にparent.prototype.constructorが変わってしまうので、
	// インスタンスのconstructorメンバを設定してprototypeを汚さないようにしている。
	function ctor() {
		this.constructor = child;
	}
	ctor.prototype = parent.prototype;

	// 継承用parentオブジェクトをprototypeとして設定する。
	child.prototype = new ctor();
	
	// __super__というプロパティから、親クラスのメソッドを参照できるようにする
	child.__super__ = parent.prototype;
	
	// 完成したクラスを戻す
	return child;
};