Sprache: Javascript
Betriebssystem: Ubuntu 14.04
Browser: Getestet in Chrom, Chrome, Firefox.Wie binde ich den Parameter 'this' an jedes Element eines Arrays, wenn forEach() verwendet wird?
Hintergrund
ich ein HTML5 Canvas Spiel mache, dass verschiedene Sammlerstücke hat. Die übergeordnete Klasse für diese Elemente ist Collectable
, das hat eine render()
Funktion:
Collectable.prototype.render = function(){
// renders the collectables
}
Es gibt verschiedene Unterklassen von Collectable
, von denen alle Delegierten render()
an der übergeordneten Klasse. Zum Beispiel:
var Heart = function(x, y) {
Collectable.call(this, x, y);
}
Heart.prototype = Object.create(Collectable.prototype);
I instanziiert meine Sammler, indem zuerst alle meine Sammler Erstellen eines Arrays enthält:
var collectables = [];
var numOfEach = 5;
// IIFE so as to not pollute global scope
(function() {
for (var i = 0; i < numOfEach; i++) {
// TODO: make this cleaner
var heart = new Heart(100, 200);
collectables.push(heart);
var gemBlue = new GemBlue(100, 200);
collectables.push(gemBlue);
var gemOrange = new GemOrange(100, 200);
collectables.push(gemOrange);
}
})();
Dann in meinem Spiel Loopdatei, ich habe eine renderEntities()
Funktion, die immer wieder einzelne Anrufe Methoden machen meine Objekte auf:
function renderEntities() {
// render my other objects
...
// render collectables
collectables.forEach(function() {
// test what 'this' is bound to
console.log(this);
// call render method
this.render();
});
}
... aber in diesem Fall ist this
zu window
gebunden und dafür e this.render
ist keine Funktion.
Frage
Wie binde ich this
auf jedes einzelne Element meiner collectables
Array?
Meine Forschung
ich die documentation for the bind
function gelesen habe, aber ich fürchte, ich kann Sie nicht arbeiten, wie dies mit forEach()
und meiner anonymen Funktion angewandt werden würde.
Ich fand dann this existing question, die erläutert, wie forEach
einen optionalen Parameter zu this
setzt. Nach den documentation on forEach
Lesen habe ich versucht, die folgende mit erfolglosen Ergebnissen:
collectables.forEach(function() {
// test what 'this' is bound to
console.log(this);
// call render method
this.render();
}, this);
... was natürlich die gleiche Wirkung hatte this
auf das globale Objekt zu setzen.
collectables.forEach(function() {
// test what 'this' is bound to
console.log(this);
// call render method
this.render();
}, collectables);
... das hat mir ein wenig näher, als this
zum Sammler Array als Ganzes gebunden ist, aber offensichtlich this.render
ist noch keine Funktion. Ich kann nicht sehen, welches Argument ich hier in forEach
verwenden kann, um this
an jedes Element des Arrays zu binden.
Ich habe das Gefühl, dass nach der Eingabe all dies die Antwort sehr einfach sein wird. Ich bin relativ neu in dem Konzept von this
so gehen Sie einfach auf mich!
Ich habe keine andere Frage gefunden, die das für mich beantwortet, oder zumindest eine, die ich angesichts meines Wissensstandes verstehen kann. Zum Beispiel habe ich folgende Fragen betrachtet:
- Calling a class function in forEach: how Javascript handles “this” keyword.
- The invocation context (this) of the forEach function call
- Passing scope to forEach
try 'collectables.forEach.call (Sammler, Rückruf) ' –
Sind Sie daran interessiert, das Schlüsselwort' this' gezielt zu verwenden? Es scheint, als würde Ihr Beispiel funktionieren, wenn Sie das Array-Element als Teil des 'forEach'-Callbacks eingefügt haben. Zum Beispiel, 'collectibles.forEach (function (collectible) {collectible.render();});' – Himmel
Hätte nicht jedes Objekt, das an den 'forEach'-Callback übergeben wurde, Zugriff auf die 'render'-Methode? In diesem Fall brauchen Sie "this" nicht wirklich im Callback. –