対処できない問題があります。
コンテキストは次のとおりです。継承チェーンが必要であり、この継承に属するオブジェクトのメソッドはイベント ハンドラーである必要があり、同時にオブジェクト プロパティにアクセスできる必要があります。
「新しい」という言葉を使わずに JavaScript を書き、代わりに継承階層を持つ Object.create() を使用しようとしています。というわけで、まずはこのアプローチ。
したがって、残りのオブジェクト (myProto) の設計図があり、次に Object.create を使用してオブジェクトを作成します (またはに割り当てるトリックthis
を実行できるクロージャがないようにします)。ここで、このオブジェクトのメソッドを使用して、たとえば div のクリック イベントを処理すると、明らかに DOM オブジェクトが参照され、オブジェクトのプロパティにアクセスできなくなります。that
self
this
var myProto = {
init: function (name, value) {
this.name = name;
this.value = value;
return this;
},
someHandler: function (e) {
// Normally I would use this instead of e.target...
e.target.innerHTML = this.name + this.value; // This does not refer to the object.
}
};
var myObject = Object.create(myProto).init('myName', 'myValue');
document.getElementById('myDiv').onclick = myObject.someHandler;
ここでフィドル:http://jsfiddle.net/pgPHM/
そして今、「古典的な」アプローチ:私が新しいコンストラクターフォームを使用していた場合、クロージャーでこれを割り当ててからアクセスするのは簡単ですが、Constructor.prototype の関数には問題があります。
var Constructor = function (name, value) {
var self = this;
self.name = name;
self.value = value;
};
Constructor.prototype.someHandler = function () {/*self does not reach this here*/};
jsfiddle: http://jsfiddle.net/ZcG3J/2/
これらのトリッキーなコンテキスト、クロージャーなどなしで、 JSオブジェクトが実際のオブジェクトthis
またはそれ自体を参照するものを持たない理由が本当にわかりません...self
基本的に質問は次のとおりです。
オブジェクトのメソッドをイベント ハンドラーとして使用しながら、オブジェクトにアクセスするにはどうすればよいですか?