[解決済み] 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);
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
-
[解決済み] 文字列がhtmlであるかどうかをチェックする
-
[解決済み] CORS: 認証モードは 'include' です。
-
[解決済み] JavaScriptとLuaの微妙な違い [終了しました]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] コールバック内で正しい `this` にアクセスする方法
-
[解決済み] JavaScript で範囲を作成する - 奇妙な構文
-
[解決済み] jqueryでdivの要素がオーバーフローしていないかチェックする
-
[解決済み] なぜJavaScriptでは!{}[true]がtrueに評価されるのですか?
-
[解決済み] URL/アドレスバーからJavascriptの関数を呼び出す
-
[解決済み] javascript includes() 大文字小文字を区別しない
-
[解決済み] Reactメモを使うべきではない場合とは?
-
[解決済み] ECMAScriptとは?
-
[解決済み] Javascript の parseInt() で先頭のゼロを削除する。
-
[解決済み] これは純関数ですか?