2011年6月16日木曜日

Prototype.jsでmixIn的なことに今更チャレンジしてみる

今回はちょぅとMongoDBを離れて、JavaScirptの話。
もっとJavaScriptをゴリゴリ書けるようにならないとなぁと思っている今日この頃。
何か微妙だよなぁと思っている所を積極的に解決してみる事にした。
共通的な機能をJavaScriptの中で持たせたい時。勿論、別のJavaScriptをゴリゴリ読むでもよいんだけど、
あまりにもそれでは保守性も可読性も悪かろうにということで、下記の様な感じ。
今回はデバック的な機能(JavaでいうtoString()的なもの)を横断的に持たせたいなぁという話。

ソースはPrototype.jsベースです。
//大元のクラス。
var Component = Class.create({
 //constructor
 initialize : function(name){
  this.name = name;
 },
 
 hello: function(){
  alert("hello," + this.name);
 },
});

//こんな感じのclosureをmixInの対象にしてみる。
var JsLog = function(){
 var log = []
 function record(message){
  log.push(message);
 }
 
 function dump(){
  alert(Object.inspect(log));
 }
 
 function clear() {
  log = [];
 }

 return {
  record : record,
  dump: dump,
  clear : clear
 }
}();

//こういう感じでmixInも出来る。
//var ComponentPlus = Class.create(Component,JsLog);
//Prototype的にはこっちを推奨。もちろん、中身は自分で連想配列的に書いてもオK。
Component.addMethods(JsLog);
なるほどなぁ、JavaScript奥深し。というかPrototype.js奥深しかもしれないけど。
もっと良い方法あれば教えて下さい。