JavaScript/Objekte/Array/of

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Die Methode of des Konstruktors Array gibt ein neues Array zurück, das die übergebenen Argumente enthält.

of löst das Problem, dass die Spezifikation für das Verhalten des Array-Konstruktors nur als kaputt bezeichnet werden kann. Ruft man Array() mit einer einzelnen Zahl als Argument auf, entsteht ein Array mit dieser Anzahl von leeren Einträgen. Jeder andere Aufruf erzeugt ein Array, das die an Array() übergebenen Werte enthält.

Mit Array.of() erhält man dagegen grundsätzlich ein Array, das die übergebenen Werte enthält.


Syntax

Array.of([...items])


Attribute
Writable true
Enumerable false
Configurable true


Beschreibung

Wird die of-Methode als Array.of(...) aufgerufen, ergibt sie kaum Sinn, denn man kann genauso gut ein Array-Literal notieren.

Anders ist es, wenn man eine Subklasse von Array erzeugt hat. Die Konstruktorfunktion der Subklasse erbt die of</code>-Methode, und of</code> ist so programmiert, dass sie erkennt, dass sie kein Array zu erzeugen hat, sondern ein Objekt der Subklasse.

Aufruf von of auf einer Subklasse von Array
class ExtArray extends Array {
   constructor(k) {
      super(k);
      console.log(`Erzeuge ExtArray mit ${k} Einträgen!`);
   }
}

const xa = ExtArray.of(4, 7, 9);
console.log(xa.constructor.name, ": ", xa);
// ExtArray: [ 4, 7, 9]

Das Beispiel gibt zunächst aus, dass ein ExtArray mit 3 Einträgen erzeugt wird, und dann das ExtArray selbst. Es sieht in der Konsole genauso aus wie ein normales Array, weil die log-Methode es von einem normalen Array nicht unterscheidet.

An Stelle einer Subklasse von Array kann man Array.of auch für beliebige andere Konstruktorfunktionen aufrufen. Dazu verwendet man die Methode call, die jede Funktion besitzt, um den this-Wert des Aufrufs festzulegen:

Beispiel
function Demo(x) {
   console.log(`Demo wurde mit x=${x} aufgerufen`);
}
const demo1 = Array.of.call(Demo, 11, 22, 33);
console.log(demo1.constructor.name);        // Demo
console.log(demo1.length);                  // 3
console.log(demo1[2]);                      // 33

Wenn Sie allerdings ein this-Objekt übergeben, das keine Konstruktorfunktion darstellt (z. B. ein beliebiges Objekt oder eine Pfeilfunktion), wird ein einfaches Array erzeugt.

Polyfill

Die Methode of wurde mit ECMAScript 2016 standardisiert und ist deshalb in allen aktuellen Browsern bekannt. Ein Polyfill ist deshalb nicht mehr erforderlich. Die korrekte Implementierung eines Polyfills erfordert die Erkennung von abgeleiteten Konstruktorfunktionen und ist deshalb nicht trivial.

Weblinks