6

質問の言い方がよくわからないので、例を示します。

function foo() {
  window.addEventListener("keydown", function(event) {
        bar(event.keycode);
}

foo.prototype.bar = function (keycode) {
//code
}

を使用してみましたが、 asthis.bar()を使用することになります。これを行う方法はありますか、それとも別の初期化メソッドを手動で呼び出す必要がありますか?windowthis

4

3 に答える 3

8

渡す前にバインドthis.barします。this

function foo() {
    window.addEventListener("keydown", this.bar.bind(this), false);
}


foo.prototype.bar = function (event) {
    console.log(event.keyCode);
}

デモhttp://jsfiddle.net/2tee4/

于 2012-07-06T14:31:05.287 に答える
5

Function.prototype.bind利用可能な*がなく、関数を追加したくない場合の代替ソリューションは、次Function.prototypeの呼び出しを閉じることthis.barです。

function foo() {
    var self;
    self = this;
    window.addEventListener('keydown', function (e) {
        self.bar(e);
    }, false);
}
foo.prototype.bar = function (e) {
    console.log(e.keyCode);
}

*addEventListenerなしを使用すると、それは許容できる選択であるとattachEvent私は信じますがFunction.prototype.bind


さらに、などのライブラリjQueryには、独自の形式のbindjQueryが含まれている場合がありjQuery.proxyます。

于 2012-07-06T14:44:42.700 に答える
4

作成されたすべてのリスナーに新しいリスナーを追加することを意図している場合foo、別のオプションは、 EventListenerインターフェイスをfoo実装し、ハンドラーの代わりに単純に渡すことです。this

function Foo() {
    window.addEventListener("keydown", this, false);
}

Foo.prototype.bar = "foobar";

Foo.prototype.handleEvent = function(e) {
    console.log(e.type);   // "mousedown" (for example)
    console.log(this.bar); // "foobar"
};

new Foo();

これは でのみ機能することに注意してくださいaddEventListener()

デモ: http://jsfiddle.net/k93Pr/

于 2012-07-06T14:49:03.620 に答える