前の記事の続きのようなものです

thisが使えないって問題でとりあえず動く方法だけ書いたけどもう少し詳しく

とりあえずサンプルプログラム
function a(x){
	this.a = x;
}
a.prototype = {
	setTimeout : function settimeout(method,time){
		console.log(this);
		var array = [];
		array.push( function(_this,method){
			var args = [];
			console.log(this,_this);
			for(var i=2;i<arguments.length;i++){
				args.push( arguments[i] );
			}
			eval("_this."+method).apply(_this,args);
		} );
		array.push( time );
		array.push( this );
		array.push( method );
		for(var i=2;i<arguments.length;i++){
			array.push( arguments[i] );
		}
		return setTimeout.apply(null,array);
	},
	f: function(arg){
		this.a = arg;
		console.log(this);
	},
	set: function (arg){this.setTimeout("f",1000,arg);},
	show: function (){console.log(this.a);}
}
b = new a(0);
b.show(); // 0 b.set(100); b.show(); // 0
// 1秒後
b.show(); // 100 

クラス内にsetTimeoutメソッドを作ることで
set: function (arg){this.setTimeout("f",1000,arg);},
という風に使えるようにしました
setTimeout関数とほぼ同じで、違いは第一引数を文字列として()なしで書くこと

いろいろ試してると処理は正常に終わってるのにthis.aが変更されてなくて
途中でthisがグローバルになってるって問題があったので、
所々にあるconsole.logでthisを表示してます
このプログラム動かすとコンソール表示は
0  // set前のb.show()
a  // setTimeoutメソッドの最初のconsole.log(this)
0  // set後のb.show()
Window a  // setTimeout関数で呼ばれる関数のconsole.log(this,_this)
a  // fメソッド内
100  // 1秒後のb.show()
setTimeout関数はapplyで呼んでもグローバルでの実行になります
thisを第一引数に渡すとエラーになります Chromeだと「illegal invocation」とエラー表示
なのでsetTimeoutの中でthisを_thisで受け取って、_thisを使ってメソッドを実行します
最後のfメソッド時のthisがaになっているのでthis.aがちゃんと書き換わります
thisがaって出てるのはクラス名がaだからです

書く文字数が減るかなと思ってsetTimeoutと違った書き方になりましたが
同じように
this.setTimeout(this.f,1000,arg);
こう書きたいなら
setTimeoutメソッドを
setTimeout : function settimeout(func,time){
console.log(this);
var array = [];
array.push( function(_this,func){
var args = [];
console.log(this,_this);
for(var i=2;i<arguments.length;i++){
args.push( arguments[i] );
}
func.apply(_this,args);
} );
array.push( time );
array.push( this );
array.push( func );
for(var i=2;i<arguments.length;i++){
array.push( arguments[i] );
}
return setTimeout.apply(null,array);
},
こうするといいです