setTimeout内で"this"を使うには?

[上に] [前に] [次に]
Maja [E-Mail] 2000/05/15(月) 21:26:11
はじめましてMajaです。現在JavaScriptの勉強をしてます。

自分で作成したオブジェクトのプロパティから、ほかのプロパティをsetTimeoutで呼び出したいのですが、なにかよい方法はありませんか。
setTimeout("this.property()",1000)とやるとだめみたいでした。
ちなみに"this.property()"の部分に文字列変数を使用できるみたいなので、this自体を文字列に変換する方法でもかまいません。

ご存知の方、いらっしゃいましたらご教授ください。

shin' 2000/05/15(月) 23:14:34
>setTimeout("this.property()",1000)とやるとだめみたいでした。
>ちなみに"this.property()"の部分に文字列変数を使用できるみたいなので、this自体を文字列に変換する方法でもかまいません。

thisに関数ではなく変数のメンバをつくって、
setTimeout(this.varMember,1000)
ってやるのは?

もしかしたら、setTimeoutがオブジェクトのメンバへのアクセスを
嫌がるかもしれませんが…。

maja [E-Mail] 2000/05/16(火) 18:44:05
shin'さん、回答ありがとうございます。
勉強不足でよくわからないのですが、コンストラクタで
this.varMember = "funcion名()";
とするということですか?
これっだったら成功してます。
オブジェクトを作るときの渡す引数にオブジェクトの名前を入れてやってみました。
this.func = name+".action()";
ていう感じにしてました。結果はOKでした。
ただ、thisの名前を文字に変えられれば引数を渡さなくてすむと思いまして…
だめですかね〜。

shin' 2000/05/17(水) 09:30:11

>自分で作成したオブジェクトのプロパティから、ほかのプロパティをsetTimeoutで呼び出したいのですが、なにかよい方法はありませんか。

ちょっと勘違いしてました。
setTimeoutの第1引数は関数名ですね。

>ただ、thisの名前を文字に変えられれば引数を渡さなくてすむと思いまして…

thisからオブジェクト名を得る方法は、
僕も探しましたけど、見当たりませんでした。

>this.func = name+".action()";

↑がいちばん賢いと思います。

zizz... [HomePage] 2000/05/17(水) 16:05:30
# 現実逃避。

> 自分で作成したオブジェクトのプロパティから、ほかのプロパティをsetTimeoutで呼び出したいのですが、なにかよい方法はありませんか。
> setTimeout("this.property()",1000)とやるとだめみたいでした。

これだと、setTimeout の引数に指定している "this" は Global Object (Window Object) を指しています。
第一引数の文字列は、setTimeout 側で処理されるので、この動作は不自然なものではありません。

他思いつかないので汚い方法を紹介。
適当にグローバル変数を作って、それに this を代入しておく。
foo = this として
setTimeout("foo.myMethod1()", 1000);
とする。

----- テスト (注意: 互換性の問題を無視している)
var foo;
function MyObject() {};
MyObject.prototype =
{
    myVariable1: 1,
    myMethod1: function () {
        alert(this.myVariable1);
    },
    myMethod2: function () {
        foo = this;
        setTimeout("foo.myMethod1()", 1000);
    }
};
var myObject1;
function init()
{
    myObject1 = new MyObject();
    myObject1.myVariable1 = 2;
    myObject1.myMethod2();
}

Maja [E-Mail] 2000/05/17(水) 23:18:45
[[解決]]
> thisからオブジェクト名を得る方法は、
> 僕も探しましたけど、見当たりませんでした。
やっぱりだめですか...
どうも、お世話おかけしましたm(__)m

> 適当にグローバル変数を作って、それに this を代入しておく。
> foo = this として
> setTimeout("foo.myMethod1()", 1000);
そういう手もありましたか!
なるほど、聞いてみるものだ。
いや、待てよ...グローバル変数だと同じ種類のオブジェクト2個以上作ったとき書き換えられてしまいますね。
やっぱりだめか...前の通りにします。

お二人とも、本当にありがとうございました。

[上に] [前に] [次に]