JavaScript/Objekte/Function/call

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Die Function.prototpye.call()-Methode ruft eine Funktion mit dem Argument this und individuellen Argumenten auf.

Sie unterscheidet sich von Function.prototype.apply() dadurch, dass sie eine Liste von Argumenten und apply() einen einzelnen Array von Argumenten akzeptiert.

Beispiel
meineFunktion.call(thisArgument[, Argument1[, Argument2[, ...]]])

Folgende Angaben sind möglich:

  • thisArgument: Wert, der als this-Parameter übergeben werden soll.
  • Argument1, Argument2, ...: der bound-Funktion vorangestellte Argumente

Anwendungsbeispiel

Eine Funktion mit einem beliebigen Wert für this aufrufen zu können bietet die interessante Möglichkeit, Methoden von einem Objekt für ein anderes Objekt zweckzuentfremden. Das klappt natürlich längst nicht immer, aber einige der auf Array.prototype definierten Methoden sind bewusst so einfach gehalten, dass sie für alle Objekte funktionieren, die sich wie ein einfaches Array verhalten. Das Objekt muss dafür eine length-Eigenschaft besitzen, und die darin gesammelten Werte müssen mit Indexzahlen von 0 bis length-1 ansprechbar sein.

Diese grundlegenden Eigenschaften werden beispielsweise von einer NodeList unterstützt. Wenn wir also eine Funktion schreiben wollen, die von allen Elemente in einer NodeList die id-Attribute einsammelt, könnten wir das so tun:

Anwenden von Array.prototype.map auf eine NodeList
function SammleIDs(nodelist) {
   if (!(nodelist instanceof NodeList))
      throw new TypeError('SammleIDs erwartet eine NodeList');
   return Array.prototype.map.call(nodelist, element => element.id);
}
Anmerkung: Statt Array.prototype.map sieht man oft auch die kürzere Schreibweise [].map. Das funktioniert, weil [] ein Literal für ein leeres Array ist, das die map-Methode von Array.prototype erbt. Man erzeugt damit für JavaScript aber den Mehraufwand, ein leeres Array zu erstellen und gleich wieder wegzuwerfen.

Die Funktion SammleIDs stellt zunächst sicher, dass auch wirklich ein NodeList-Objekt übergeben wurde. Wenn nicht, wirft sie einen TypeError, um den Programmierer zur Fehlerkorrektur zu zwingen.

Erhält sie eine NodeList, wird die map-Methode, die als Funktion im Array.prototype Objekt zu finden ist, mit der NodeList als this-Wert sowie einer kleinen Pfeilfunktion als Callback aufgerufen. Die map-Methode ist ausdrücklich so spezifiziert[1], dass sie mit einem Array-artigen Objekt in this umgehen kann.

Der Rückgabewert von map ist ein Array mit den Ergebnissen des Callback-Aufrufs, also die IDs aller Elemente in der NodeList.

Siehe auch

Weblinks

  1. ECMAScript-Spezifikation: Definition der map-Methode von Array.prototype