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);
}
}
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;}
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."
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."