1. ホーム
  2. javascript

[解決済み] JavaScript のクラスメソッドで 'this' が未定義である。

2022-12-01 23:12:45

質問

私はJavaScriptに新しいです。私が実際に行ったのは、既存のコードを微調整し、jQueryの小さな部分を書いただけなので、新しいです。

今、私は属性とメソッドを持つ "class" を書こうとしていますが、私はメソッドで困っています。私のコードです。

function Request(destination, stay_open) {
    this.state = "ready";
    this.xhr = null;
    this.destination = destination;
    this.stay_open = stay_open;

    this.open = function(data) {
        this.xhr = $.ajax({
            url: destination,
            success: this.handle_response,
            error: this.handle_failure,
            timeout: 100000000,
            data: data,
            dataType: 'json',
        });
    };

    /* snip... */

}

Request.prototype.start = function() {
    if( this.stay_open == true ) {
        this.open({msg: 'listen'});
    } else {

    }
};
//all console.log's omitted

問題は Request.prototype.start , this が未定義であるため、if文はfalseと評価されます。私はここで何を間違えているのでしょうか?

どのように解決するのですか?

どのようにstart関数を呼び出しているのですか?

これは動作するはずです ( 新しい がキーです)

var o = new Request(destination, stay_open);
o.start();

のように直接呼び出すと Request.prototype.start() , this はグローバルコンテキストを参照します ( window を参照します。)

また、もし this が未定義の場合、エラーになります。if式がfalseに評価されない。

更新 : this オブジェクトは、宣言に基づいて設定されるのではなく 呼び出し . これはどういうことかというと、関数プロパティを変数に代入すると x = o.start のように変数に代入し x() , this の内部開始はもはや o . このようなことが起こるのは setTimeout . これを動作させるには、代わりに次のようにします。

 var o = new Request(...);
 setTimeout(function() { o.start(); }, 1000);