読者です 読者をやめる 読者になる 読者になる

この日記は私的なものであり、所属会社の見解ではありません。 GitHub: takahashikzn

new演算子のオーバーロード?

Javascript

いま知ったのですが、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)

これって有名なテクなんですかね?