名前空間のケチり方

jQueryの現在のコードだと、

window.$ = function () {
	return new $.prototype.init();
};

$.prototype = {
	init: function () {
		// コンストラクタ
	}
};

$.prototype.init.prototype = $.prototype;

こういう風にやっている。僕はあまり好きじゃない。できれば、initで分けたくないし、最後の一行の突っ込むのも気色悪い。

そんなわけで古いコードに当たってみた。1.2.1はこんなのだった。

window.$ = function () {
	return this instanceof $ ? this.init() : new $();
};

$.prototype = {
	init: function () {
		// コンストラクタ
	}
};

ここで見たコードによく似ている。arguments.calleeは使いたいところだけど、IE5が対応していないので、残念。

1.2まではこうなっていた。

window.$ = function () {
	if (this == window || !this.init)
		return new $();
	return this.init();
};

$.prototype = {
	init: function () {
		// コンストラクタ
	}
};

this.initがあるのはthis==windowがtrueにならないIE対策っぽい。でも、window.window==windowだから、

window.$ = function () {
	if (this.window == window)
		return new $();
	return this.init();
};

$.prototype = {
	init: function () {
		// コンストラクタ
	}
};

こうでもいける。

個人的にはinstanceofに惹かれるんだけど、変わった1.2.2のリリースノートには300% Speed Improvements to $(DOMElement)ってあるから、これのために変わったのかと思っている。そう思ったけど、全然関係なかった。ベンチとったけど、差はない。早くなったのは、DOMElementの時は別処理になったため。