IT戦記

プログラミング、起業などについて書いているプログラマーのブログです😚

Re: new の挙動

以下のエントリへの反応です。

new function() {
  //どうのこうの
}

は、

(function(){
  this={}
  //どうのこうの
  return this
})();

みたいなことしてるんだろうか。

http://d.hatena.ne.jp/gnarl/20070628/1183009662

thisキーワードなので変数としては使えないのですが、使えるとするならば、ほとんどそれに近い挙動だと

思います。

一つだけ違うのは

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 プロパティプロパティを見に行くからなんです。
こういうときに、 thisnew された関数の prototype プロパティオブジェクトをプロトタイプとして持っていると言います。
ややこしいですね。

ちなみに Firefox では new をほぼ完全に再現することができます。

(function() {
  var _this = {}:
  _this.__proto__ = arguments.callee.prototype;
  return _this;
})()

ややこしいですね。

まとめ

ややこしいけど、おもしろいですね。