私の Web アプリケーションには、オブジェクト関数コンストラクターで定義したカスタム オブジェクトがあり、コンストラクター プロトタイプを介してさまざまな共有プロパティを適用しています。
MyObject = function (Name) {
this.Name = Name;
this.ListItem1 = document.createElement('li');
this.ListItem1.onclick = this.SetActive;
this.ListItem2 = document.createElement('li');
this.ListItem2.onclick = this.SetActive;
}
MyObject.prototype.SetActive = function () {
alert('SetActive: ' + this.Name);
}
これは簡単な例ですが、実際のオブジェクトにはさらに多くの DOM 要素が関連付けられており、それらの各 DOM 要素にはさまざまなイベント リスナーがあります。私のオブジェクトには、他にも多くのプロパティとメソッドがあります。このオブジェクトのインスタンスが何千もある可能性もあるため、コードの効率が重要です。
私の問題は、DOM イベントがトリガーされると、イベント ハンドラーの「this」プロパティが、オブジェクト インスタンスではなく、実際の DOM 要素に設定されることです。
例えば:
var HelloObj = new MyObject('Hello');
HelloObj.SetActive();
//This alerts 'SetActive: Hello'
HelloObj.ListItem1.click();
//This alerts 'SetActive: undefined' because 'this' in SetActive
//becomes ListItem1 and obviously ListItem1.Name is undefined
では、DOM 要素のイベント ハンドラーを関数ポインター (多数のオブジェクト インスタンスがある場合に非効率になる各イベント ハンドラーの新しい関数インスタンスではない) に設定し、オブジェクト インスタンス自体のコンテキストを保持するにはどうすればよいですか? 'これ'?