新しい書き方

ECMAScript (JavaScript, ActionScript など) では new の対象に関数を持ってくることができる.

function foo() {}
new foo();

この関数をコンストラクタ関数とよび、ふつうはコンストラクタ関数内で this を使って生成されるオブジェクトにアクセスする.
ところがコンストラクタ関数内で新しくオブジェクトを作って返してやると、それが new で生成されるオブジェクトになるらしい.

function foo() {
    var a={};
    return a;
}

// ↓これで返ってくるのは a だよ!
new foo();

この a を関数とすることもできる.また、コンストラクタ関数内で a にプロパティを設定することもできる*1ので、

  1. ふつうにメソッドやプロパティを持つ
  2. しかも関数として呼べる

不思議なオブジェクトを new で生成することが可能だ.

function foo() {
    var a = function(){ return "test"; };
    a.say = function(){ return "hello"; };
    return a;
}

a.say() // hello
a();    // test

これをメソッドチェーンの形と混ぜてやると以下のような書き方が合法になる.

a = new foo(); // <-- 関数としても呼べるオブジェクト
a.foo(5)
 .bar(4)
 (2)
 .foo(5);

これでなにかおもしろいライブラリが作れないか考え中.

*1:ただし ActionScript の場合は変数の型宣言を * にするのを忘れずに