JavaScript の コンストラクタの戻り値

LDR のソースを見ていて一つ不思議に思ったんですが、

new MyClass

として返ってくるのは、普通はインスタンスですよね。ところが、そうではない使い方をしている箇所がありました。

こんな形です:

function Hello() {
  var hello = function () {
    alert("Hello, world!");
  };
  return hello;
}
var h = new Hello;
h(); // -> "Hello, world!"

実際には "Pipe" という、クロージャを駆使した、非常に高度な関数なんですが、例のように (インスタンスではなく) ローカルで定義した関数を戻り値として返しているんです*1

こういう特殊なコンストラクタの使い方はまず見かけないですね。特に prototype.js ベースのコーディングをしていると出てこない発想だと思います。

タイトルで「コンストラクタ」と言っていますが、そもそもメンバー・(メソッド|変数) を定義していない関数を「コンストラクタ」と呼んで良いのかという疑問はあります。おそらく new を使わず単純な関数呼び出しとしても同じ結果が得られるんじゃないでしょうか?

(邪推すると、意識的にインスタンスっぽく見せるために new を使っている、ということなのかも知れません。)

ちなみに、

function Hello() {
  this.hello = function () {
    alert("Hello, world!");
  };
  return null;
}
var h = new Hello;
h.hello();

が "Hello, world!" を表示することが確認できます (IE)。メンバー・メソッドを定義している場合、return は意味を持たなくなる、ということですね。

*1:普通コンストラクタでは return で値を返すことはしません