JavaScript
new

JavaScriptのnewの知られざる2番目の使い方

あまり良いタイトルではないですが
2つの使い方があるよ、という話です。

this についてここ(JavaScriptのthis(コンテキスト)とは?)で書いたのですが、
そういえば this の話なのに new にあまり触れてなかったなと気づいた流れで、
new といえばそういえば2通りの使い方があるなということで書いてみました。

new の2通りの使い方。

var a = new function(){ // 使い方:1つ目
  this.x = 'x1';
  this.y = 'y1';
};

var b = new function(){ // 使い方:2つ目
  var that = {};
  that.x = 'x2';
  that.y = 'y2';
  return that;
};

console.log( a.x, a.y ); // x1,y1
console.log( b.x, b.y ); // x2,y2

newで関数を実行した際にその中で、

・object(hash) を return した場合にはそれ自体が new の戻り値として返り、( ↑で書いた "2つ目")
・それ以外は [何かしら] が返ってきます。 ( ↑で書いた "1つ目")

この [何かしら] は内部的には this としてアクセスできて、外部的にはそれを代入した変数 a からアクセスできます。

a も b も外からアクセスする分には同じ動きをします。

var c = (function(){
  var that = {};
  that.x = 'x3';
  that.y = 'y3';
  return that;
}());

この c も同様の動きです。(new 使った例ではないですが)

で、「何が違うんだ?」とか「どう使い分ける?」

とかですが、b,c は全く同じなのでどちらでもいい思います。(私は c の書き方をよく使う)
結局のところ単に object(hash) を返しているだけです。
何か初期化の処理をしたいな~とかいう場合に使ってます。

a は b,c っぽい [何かしら] が返ってきますが、[何かしら] 特有の機能が付与されているというだけの違いです。
特有の機能とは以下の暗黙のプロパティ2つに関しての話です。

[何かしら].prototype
[何かしら].constructor

b,c にもこれはあるんですけど、b,c は親の扶養家族みたいなもので、
a の new は独り立ちして一軒家を作る場合に使う、という感じです。

一軒家の話は長くなるのと、とりあえず new のこの2つについて書きたかったのでここまでで。