« Kanasan.JS#2のアンケートのまとめ | メイン | 私にとっての過渡期 - 「ウェブ時代をゆく」を読んで »

JavaScriptでRubyのMixInみたいな事を実現する

JavaScriptでRubyのMixInのようなものを実現する方法をふと思いついたので書いてみる。
既に誰かが何処かで書いているかもしれないがとりあえず。
MixIn用の処理例
//MixIn用
function MixIn(){}

//MixInの準備・既にMixIn済であればfalseを、MixInの準備完了であればtrueを返す
MixIn.readyMixIn=function(){
    var mixInMethod=arguments.callee.caller;
    if(!this._mixIn){this._mixIn={};}
    var check=this._mixIn[mixInMethod];
    if(!this._mixIn[mixInMethod]){this._mixIn[mixInMethod]=true;}
    return !check;
}

//ユーティリティメソッド追加
MixIn.addUtilities=function(){

    //何度もMixInしないようにする
    if(!MixIn.readyMixIn()){return;}

    arguments.callee.caller.prototype.displayThisValue
    =function(){
        var val="This value is "+this+".";
        alert(val);
    }

}

//比較メソッド追加
MixIn.addComparisons=function(){

    //何度もMixInしないようにする
    if(!MixIn.readyMixIn()){return;}

    arguments.callee.caller.prototype.isBigger
    =function(num){
        return (this>num);
    }
    arguments.callee.caller.prototype.isSmaller
    =function(num){
        return (this<num);
    }
    arguments.callee.caller.prototype.isEqual
    =function(num){
        return (this==num);
    }

}
MixInをしている例
function TestClass(arg){
    this._arg=arg;
    MixIn.addComparisons();
    MixIn.addUtilities();
}
TestClass.prototype.toString=function(){return this._arg.toString();}
TestClass.prototype.valueOf=function(){return this._arg;}
MixInのしたメソッドの使用例
var o=new TestClass(10);

alert(o.isBigger(9));       //true
alert(o.isSmaller(8));      //false
alert(o.isEqual(10));       //true
alert(o.isEqual("10"));     //true
o.displayThisValue();       //"This value is 10."

var o=new TestClass("c");

alert(o.isBigger("a"));     //true
alert(o.isSmaller("b"));    //false
alert(o.isEqual("c"));      //true
alert(o.isEqual("d"));      //false
o.displayThisValue();       //"This value is c."

トラックバック

このエントリーのトラックバックURL:
http://www.kanasansoft.com/cgi/mt/mt-tb.cgi/75

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

Google