JavaScript/Objekte/Array/of
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])
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.
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:
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
- ECMAScript Spezifikation: Array.of
- Kangax Compatibility Table: Array.of