- PR -

JavaScript setIntervalについて

1
投稿者投稿内容
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2006-04-11 13:23
下記aクラスのmoveメソッドを、setInterval関数で呼びたいと思っております。

 function a(){
  function _move(){
   alert("MOVE");
  }
  a.prototype.move = _move;
 }
 
 setInterval('????',2000);

どうしてもうまくいかないのですが、そもそも不可能なのでしょうか?
呼び出し元はクラス内外問いません。
ご存知の方がおりましたらご教授願います。
ゆう
常連さん
会議室デビュー日: 2003/06/27
投稿数: 45
投稿日時: 2006-04-11 13:40
以下、Firexfox1.5で動作しました。

<html>
<head>
<script type="text/javascript">
function a(){
function _move(){
alert("MOVE");
}
a.prototype.move = _move;
}
</script>
</head>
<body onload="setInterval('new a().move();',2000);">
</body>
</html>

 aクラスのmoveメソッドとして定義しているので、
そのままインスタンスのmoveメソッドを実行すれば
良いのではないでしょうか。

[ メッセージ編集済み 編集者: 悠 編集日時 2006-04-11 14:00 ]
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2006-04-11 15:32
ちなみに、環境はIEでした。

setInterval('a.move()',2000);"
setInterval('move()',2000);"
setInterval('a.move',2000);"
setInterval('move',2000);"

これまで上記のように、いろいろ試していたのですが駄目でした。

引用:

setInterval('new a().move();',2000);"



setInterval内で、new するのですね。
全く知りませんでした。ご教授ありがとうございます。
外部から newして呼び出すのは理解できました。

ただ、クラス内部から呼び出す場合は、別インスタンスのメソッドを呼ぶ事なるのかなと思います。
下記のように、パラメータでオブジェクト(_param)を渡して、外部からは、action関数を呼び出して、これを操作したいと考えています。

function a(_param){
 this.param = _param;

 function _move(){
  alert("MOVE");
  this.param.操作;
 }
 a.prototype.move = _move;

 function _action(){
  setInterval('new a().move();',2000);
 }
 a.prototype.action = _action;
}

クラス内部からmove()メソッドを呼び出す術はあるのでしょうか?
参考になるサイトをご存知でしたら、よろしくお願いします。


[ メッセージ編集済み 編集者: NV 編集日時 2006-04-11 16:08 ]
ゆう
常連さん
会議室デビュー日: 2003/06/27
投稿数: 45
投稿日時: 2006-04-12 10:13
 以下のように、インスタンス保存用の変数を用意して、
その値からメソッド実行という手段ではだめですか?

コード:
<html>
<head>
<script type="text/javascript">
//インスタンスプール
var pool = new Array();

//操作対象クラス
function p(_param){
	this.param = _param;
	function _action(){
		alert(this.param);
	}
  	p.prototype.action = _action;
}

//実行クラス
function a(_uid,_param){
  pool[_uid] = this;	//自分自身保存
  this.uid = _uid;
  this.param = _param;

  function _move(){
    this.param.action();
  }
  a.prototype.move = _move;

  function _action(){
  	//対象のインスタンスからメソッド実行
    setInterval('pool["' + this.uid + '"].move();',2000);
  }
  a.prototype.action = _action;
}
</script>
</head>
<body onload="
 new a('A',new p('MOVE_A')).action();
 new a('B',new p('MOVE_B')).action();">
</body>
</html>




 インスタンス保存用の変数なしでやるとすれば、手間はかかりますが
toSourceメソッドによりインスタンスの値とメソッド定義を取得して実行、
という方法でもいけるかもしれません。

//インスタンスの状態取得
var ins = this.toSource();
//メソッド定義取得
var method = this.move.toSource();
//タイマー起動(moveメソッド内でinsのパラメータ解析し、実行)
setInterval('method=' + method + ';method(' + ins + ');',2000);
NV
ベテラン
会議室デビュー日: 2003/05/20
投稿数: 73
投稿日時: 2006-04-12 15:41
ご回答ありがとうございます。

引用:

悠さんの書き込み (2006-04-12 10:13) より:
 以下のように、インスタンス保存用の変数を用意して、
その値からメソッド実行という手段ではだめですか?



やはり、グローバル領域を使用しないと思惑通り行かなそうですね。
各インスタンス毎に独立して動作させたかったので、このような問題に至りました。

アドバイスお礼申し上げます。

[ メッセージ編集済み 編集者: NV 編集日時 2006-04-12 15:45 ]
1

スキルアップ/キャリアアップ(JOB@IT)