いま知ったのですが、Javascriptでは、new演算子のオーバーロード的な芸当が使えます。
但し条件があって、『コンストラクタを関数として評価した結果が数値、文字列、真偽値、null、undefined以外のみ』です。
仕様的にはこれ。
http://www.ecma-international.org/ecma-262/5.1/#sec-13.2.2
具体的な検証コードは以下。
function Foo() { return 1; // "a"やtrueなどでも同じ } // 1を表示(当たり前) alert(Foo()); // [object Object]を表示 alert(new Foo()); // true。つまりFooのインスタンスなので"return 1"は無視されている alert(new Foo() instanceof Foo);
function Bar() { return new Date(); } // Date.toStringの結果(この場合は現在時刻)が表示される。当たり前 alert(Bar()); // やはりDate.toStringの結果が表示 alert(new Bar()); // false。つまりnewの結果が差し替えられている→演算子オーバーロード(的な何か) alert(new Bar() instanceof Bar); // "function Date() { [native code] }" alert(new Bar().constructor)
これって有名なテクなんですかね?