prototype
今日、Javascriptとthis
リファレンスを使用して非常に奇妙な問題に遭遇しました。
基本的に、私は2つのオブジェクトを持っています。1つのオブジェクトがdiv
要素を利用し、.onclick
にイベントを登録できるようにしdiv
ます。他のオブジェクトはこの機能をonclick
利用し、最初のオブジェクトを使用してイベントを登録します。
コードは次のとおりです。
の世話をする私の最初のオブジェクトdiv
:
DivObject = function() {};
DivObject.prototype.setClickListener = function(clickListener){
document.getElementById("myDiv").onclick = function(e){
clickListener(e);
};
};
私の 2 番目のオブジェクトは、この機能を使用します。
MainObject = function(){
this.myString = "Teststring";
this.divObj = new DivObject();
this.divObj.setClickListener(this.handleClick);
};
MainObject.prototype.handleClick = function(e){
// do something with e
};
問題は、内部MainObject.prototype.handleClick
では、this
参照がwindow
ではなくオブジェクトを参照していることMainObject
です。したがって、console.log(this)
この関数内でログが記録され[Object window]
ます。
setClickListener
回避策として、次のように関数を使用します。
var thisRef = this;
this.divObj.setClickListener(function(e){
thisRef.handleClick(e);
});
これで、関数内のthis
参照は myを参照します(私が望むように)。handleClick
MainObject
私の質問は次のとおりです。
参照が 1 回はオブジェクトをthis
参照し、もう 1 回はオブジェクトの参照を参照するのはなぜですか? どこかでオーバーライドされていますか?私はいつも自分のオブジェクトで使用すると思っていましたが、それが本当に自分のオブジェクトの参照であると確信できますか? 私が現在使用している回避策は、この問題を解決する方法ですか、それともこのケースを処理するための他のより良い方法はありますか?window
this
this
this