ECMAScript 3より前は知りませんが、ES3以降のJavaScriptのコンストラクタ関数は、new付きで呼ばれていても、returnでオブジェクトを返すとそっちを優先するという、謎機能がありました。
function TestClass() {
return {
method: function() {
console.log("good night");
}
}
}
TestClass.prototype.method = function () {
console.log("good morning");
};
var obj = new TestClass();
obj.method(); // -> good night
ECMAScript 6はそういえばどうなんだろうなーと思ってio.jsの2.0.1で試したみたら、同じ結果になりました。use strictが必要なのね。
"use strict"
class TestClass {
constructor() {
return {
method: function () {
console.log("good night");
}
};
}
method() {
console.log("hello world");
}
}
var obj = new TestClass();
obj.method(); // -> good night
というわけで、newで呼ばせるんだけど、実体は保存しておいたインスタンスを返すというシングルトンパターンとかは今までどおりできそうです。