私は今これに数回遭遇しました。私はそれを示すことができる最も単純なコードスニペットを作成しようとしました。
問題は、オブジェクトメソッド内で、匿名関数をjQueryメソッド(「each」など)に渡すと、関数内でオブジェクトの「this」にアクセスできなくなることです。「this」はjQueryオブジェクトに関連しているためです。
logNameAndElementIds
問題の核心については、メソッドの途中にあるコメントを参照してください。
(私はCrockfordのオブジェクト関数を使用して、オブジェクトリテラルで定義されたオブジェクトに基づいてオブジェクトインスタンスを生成しています。)
Object.create = function (o) {
function F() {}
F.prototype = o;
return new F();
};
var objectLiteral = {
setName: function(name){
this.name = name;
},
logNameAndElementIds: function(){
// works fine, 'this' refers to object instance
console.log( this.name );
$('.foo').each(function(){
// we've lost "this" because it now refers to jQuery
console.log( this.name );
console.log( $(this).attr('id') );
});
}
};
obj1 = Object.create(objectLiteral);
obj1.setName('Mike');
obj1.logNameAndElementIds();
この種の状況を処理または回避する正しい方法は何ですか?
明らかに私の例は愚かですが、それは単に要点を示すためのものです。多くの場合、jQueryに一致するセットをループしてから、各アイテムに含まれるオブジェクトのメソッドを呼び出します。しかし、jQueryの「this」があるため、オブジェクトのメソッドにアクセスできません。