Object-oriented Javascript: event-handling
Ich versuche, erstellen Sie ein Ereignis für ein Objekt, um es zu hören. Betrachten Sie das folgende Beispiel:
var moon;
moon = document.createEvent("Event");
moon.initEvent("Event",true,true);
var Dog = function (name) {
this.name = name;
document.addEventListener("Event",this.bark,false);
};
dog.prototype.bark = function() {
console.log(this.name + ': Awooooooof Woof!');
};
var spot = new Dog("Spot");
var dot = new Dog("Dot");
//invoke
document.dispatchEvent(moon);
Ich erwarte, um zu erhalten eine Ausgabe wie:
Spot: Awooooooof Woof!
Dot: Awooooooof Woof!
Aber was ich bekomme ist:
undefined: Awooooooof Woof!
Was falsch ist mit meinem Beispiel? Wie kann ich einen listener registrieren, dass jede Instanz der Hund hat?
Vielen Dank im Voraus!
Du musst angemeldet sein, um einen Kommentar abzugeben.
In dieser Zeile
Sie nicht binden den Umfang der
this.bark
zuthis
. In JavaScript, die den Wertthis
hängt nicht davon ab, wo die Funktion definiert ist, aber von wo es aufgerufen wird. Dies bedeutet, wenn Sie passthis.bark
zuaddEventListener
trennen Sie es von der aktuellen Objekt.In frameworks wie prototype.js und JQuery gibt es shortcuts für die Bindung
this
mit vanilla-JavaScript-Sie können es so machen:Dann:
Das problem, das Sie haben, ist, dass
this
innerhalb der Funktion bezieht sich nicht auf das Objekt, das Sie manipulieren wollen.Wie über das hinzufügen der Funktion
bark
innerhalb der definition einer Funktion?Das Problem
Den
this
Schlüsselwort, innenDog.prototype.bark()
Punkte auf das Objekt, das aufgerufen wird, die Methode. Zum Beispiel, wennspot.bark()
genannt wird,this.name
ausgewertetspot.name
etwa so:Wenn der Ereignis-listener Hinzugefügt, der im inneren des Hundes Konstruktor, der
document
Objekt wird gesagt, um einen Listener für dieses Ereignis, und sagte zu nennenDog.prototype.bark()
wenn es hört, dass event. Dieses setup richtig gemacht, und diedocument
- Objekt rufen Sie die korrekte Funktion, wenn er hört, dass Ereignis,Den ärger passiert später, wenn die
document
Objekt tatsächlich ruft die Rinde-Funktion. Jetztthis
Punkte derdocument
Objekt, undthis.name
ausgewertetdocument.name
etwa so:document.name
es nicht gibt und das ist der Grund, warum die Ausgabe:undefined: Awooooooof Woof!
Das Update
Verwenden Funktion.der Prototyp.bind() zu binden, die angegebenen Werte zu einer Funktion
this
Schlüsselwort, etwa so: