2

Javascript と OO プログラミングについてもう少し詳しく説明しますが、ここでこの動作を理解していません。なぜ私のオブジェクトなのか (myUser はプロパティ this.first_name に「jon」としてアクセスできず、代わりに未定義です (下部のスクリーンショットで赤でハイライトされています))。問題のコード フラグメントは次のとおりです。

function User(first_name, last_name){
    this.first_name=first_name;
    this.last_name=last_name;
}

// left in for completeness
User.prototype = {
    constructor: User,
    sayName: function(){
        console.log("My Name: " + this.first_name + " and " + this.last_name);
    }

}

User.prototype.whoWhat = function(){
    console.log(this.first_name + " I want to tell you now " + Math.random());
}

var myUser=new User('jon', 'johnson');
myUser.sayName();
myUser.whoWhat();
setInterval(myUser.whoWhat, 3000);

コンソール出力は次のとおりです。

ここに画像の説明を入力

4

3 に答える 3

6

問題は、setInterval()作成したオブジェクトとの関連付けがコールバックから失われることです。関数とオブジェクトをプロパティ値として関連付けることは、プロパティ値を使用して関数呼び出しを行う場合にのみ影響します。thisここでは、値を参照しているだけです (つまり、関数への参照を取得しています)。システムが関数を呼び出すと、thisundefinedまたはwindow「厳密な」モダリティに応じてオブジェクト)になります。

thisラッパー関数を使用して、それが正しい値であることを確認できます。

  setInterval(function() { myUser.whoWhat(); }, 3000);

新しいブラウザーでは、Function プロトタイプの次のメソッドを使用できますbind()

  setInterval(myUser.whoWhat.bind(myUser), 3000);

それは(あなたの目的のために)同じ効果がありますbind()が、他のこともできます。

覚えておくべき重要なことは、JavaScript では、関数とオブジェクトの間に長期的な関係がないということです。関数への参照は単なる値であり、関数がたまたまプロトタイプ オブジェクトまたはオブジェクト リテラルのプロパティとして定義されているからといって、特別なことは何も起こりません。重要なのは、関数が実際にどのように呼び出されるかだけです。

于 2013-08-17T16:58:00.280 に答える