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作った方がいう気がしちゃうなぁ…。