1

次のクラスがある場合 (単純化された例):

function MyClass() {
    this.greeting = "Where is the ice cream?";
}

MyClass.prototype.talk = function() {
    console.log(this.manners(this.greeting));
}

MyClass.prototype.manners = function(phrase) {
    return "I beg your pardon. " + phrase;
}

そして、次のように ajax 経由で送信しようとします。

var c = new MyClass();
$.ajax({
    data : c,
    url : "ajax.php",
    dataType : "json",
    type : "post"
});

MyClass.prototype.talk「は関数ではありません」という例外が から発生しthis.mannersます。この例外が発生する理由は、なんらかの理由で、ajax 呼び出しが (のインスタンスではなく) を使用して、すべてのメソッドの呼び出しを強制しているためMyClassです。thisWindowMyClass

したがって、いくつか質問があります。

  • ajax 呼び出しで、クラスのすべてのメソッドが Window for で強制的に呼び出されるのはなぜthisですか?
  • 私のやり方で電話mannersするのは適切ではないですか?talk私は自分自身を設定する必要がありますthisか?(このコンテキストでそれがどのように可能かはわかりません)

一般に、私はいつ、どのように and を使用するかについてまだまったく無知applycallあるため、このトピック全体が非常に混乱しています。過去にこのような問題 (イベント処理など) で問題が発生したときはいつでも、回避策に頼ってきましたがvar that = this;、トピックをより深く理解する時が来たと思います。その上、その修正はとにかくここでは機能しません。

4

3 に答える 3

1

データをシリアル化する必要があると思います。

data : JSON.stringify(c),

今は投稿しているようです:http://jsfiddle.net/JvPym/

thisまたはに問題はなかったと思いますwindow

于 2013-09-29T19:16:07.203 に答える
0

JavaScript について知っておくべきことの 1 つは、JavaScript にはクラスがないことです。Javascript にはオブジェクトと関数があります (関数は単なるオブジェクトです)。

this変数は関数に付加され、「呼び出しパターン」に従います。this関数の呼び出し方法に応じて、特定の値が与えられます。すべての関数オブジェクトには、呼び出された関数オブジェクトを実行するcallandメソッドがあります。applyこれらのメソッドの最初のパラメーターは、関数の実行中にコンテキストとして参照されるオブジェクトを指定しますがthis、それが null または未定義の場合は、グローバル オブジェクトwindowが使用されます。

thisこれを克服する最善の方法は、後で正しいコンテキストで参照する関数内に内部変数を作成することです。以下は、どのように書き換えられるかの例です。

function MyClass() {
        var _self = this;  
        this.greeting = "Where is the ice cream?";


    this.talk = function() {
        console.log(_self.manners(this.greeting));
    }

    this.manners = function(phrase) {
        return "I beg your pardon. " + phrase;
    }
}

_self正しいコンテキストを参照するために使用する方法に注意してください。関数では、_selfの代わりに参照するだけですthis

于 2013-09-29T19:40:06.857 に答える