DeLLa.JS #4の事をいまさら。

ブログを書くまでがDeLLa.JSらしいです。これでワタシの第4回勉強会が終了できる…。

で、本題。参加者ブログでみんな書いてるけど、JavaScriptではコンストラクタの return でオブジェクトを返すようにしておくと、new したときに別のクラスのインスタンスを返せちゃうらしい。

function Hoge() {
    return new Date();
}

var obj = new Hoge();
obj instanceof Hoge; // false
obj instanceof Date; // true

使った事ないから知らんかったですね。

で、これをどこに使うんだろうと帰り道とかに考えてた結論としては、FactoryとかDI Containerっぽい事するぐらいかなぁ、と。

function Driver(type, params) {
    if(typeof(type) != "string") {
        return;
    } else {
        return new window[type + "Driver"](params);
    }
}

// PostgreSQL用ドライバ
function PostgresDriver(params) { /* ... */ }
PostgresDriver.prototype = new Driver();
PostgresDriver.prototype.connect = function() { /* ... */ };
PostgresDriver.prototype.query   = function() { /* ... */ };

// MySQL用ドライバ
function MySqlDriver(params) { /* ... */ }
MySqlDriver.prototype = new Driver();
MySqlDriver.prototype.connect = function() { /* ... */ };
MySqlDriver.prototype.query   = function() { /* ... */ };


// インスタンス
var driver = new Driver("Postgres", {});

すごく適当なコードだけど、やりたい事のイメージは伝わりますかね?

で、この例だとSingletonとかやりたくなってくるんだろうなぁと思ってGoogleさんに聞いてみたら、ここに書いたような事はma.laたんが3年ぐらい前に通った道だったみたいで絶望しました。
最速インターフェース研究会 :: JavaScriptのデザインパターン - Singleton

まぁ、ここまでやりたいか?って言われると、わざわざ判りにくいコードにしなくても、普通にFactoryパターンか簡易DI Container作った方がいう気がしちゃうなぁ…。