Re: new の挙動
以下のエントリへの反応です。
new function() { //どうのこうの }は、
(function(){ this={} //どうのこうの return this })();みたいなことしてるんだろうか。
http://d.hatena.ne.jp/gnarl/20070628/1183009662
一つだけ違うのは
this がどういうプロトタイプを持つかということです。
new function() { arguments.callee.prototype.hoge = 'hoge'; alert(this.hoge); // hoge }; (function() { var _this = {}; arguments.callee.prototype.hoge = 'hoge'; alert(_this.hoge); // undefined return _this; })()
arguments.callee は関数自身を指します。
ですので、 this は関数自身の prototype プロパティの変更も反映されるオブジェクトだということです。
それは、 this は自分自身が持っていないプロパティを参照されると、 new された関数の prototype プロパティのプロパティを見に行くからなんです。
こういうときに、 this は new された関数の prototype プロパティのオブジェクトをプロトタイプとして持っていると言います。
ややこしいですね。
ちなみに Firefox では new をほぼ完全に再現することができます。
(function() { var _this = {}: _this.__proto__ = arguments.callee.prototype; return _this; })()
ややこしいですね。
まとめ
ややこしいけど、おもしろいですね。