▼ おーぷん ▼
とりあえずサンプルプログラム
クラス内にsetTimeoutメソッドを作ることで
set: function (arg){this.setTimeout("f",1000,arg);},
という風に使えるようにしました
setTimeout関数とほぼ同じで、違いは第一引数を文字列として()なしで書くこと
いろいろ試してると処理は正常に終わってるのにthis.aが変更されてなくて
途中でthisがグローバルになってるって問題があったので、
所々にあるconsole.logでthisを表示してます
このプログラム動かすとコンソール表示は
thisを第一引数に渡すとエラーになります Chromeだと「illegal invocation」とエラー表示
なのでsetTimeoutの中でthisを_thisで受け取って、_thisを使ってメソッドを実行します
最後のfメソッド時のthisがaになっているのでthis.aがちゃんと書き換わります
thisがaって出てるのはクラス名がaだからです
書く文字数が減るかなと思ってsetTimeoutと違った書き方になりましたが
同じように
this.setTimeout(this.f,1000,arg);
こう書きたいなら
setTimeoutメソッドを
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を表示してます
このプログラム動かすとコンソール表示は
setTimeout関数はapplyで呼んでもグローバルでの実行になります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()
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);},
▲ くろーず ▲