JavaScript/Objekte/Object/constructor

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Die Eigenschaft constructor jedes Objekts, das einer Konstruktorfunktion als Prototyp zugeordnet ist, enthält einen Rückverweis auf diese Konstruktorfunktion. Auf diese Weise kann zu Objekten, die von der Konstruktorfunktion erzeugt wurden (und damit diesen Prototypen aufweisen) die zugehörige Konstruktorfunktion ermittelt werden.

Dieser Sachverhalt gilt demnach auch für das Prototyp-Objekt der Object-Konstruktorfunktion.


Syntax

Object.prototype.constructor


Attribute
Writable true
Enumerable false
Configurable true


Verwendung

JavaScript implementiert Vererbung mit Prototypen, nicht mit Klassen. Dadurch, dass jedes Objekt, das durch eine Konstruktorfunktion erzeugt wurde, über die constructor-Eigenschaft auf diese Funktion verweist, lässt sich aber eine Art von Klassenzugehörigkeit darstellen und die „Klasse“ eines Objekts abfragen. Dies kann entweder über die name-Eigenschaft der Konstruktorfunktion geschehen (jede Funktion besitzt diese Eigenschaft) oder, wenn die Konstruktorfunktion als Objekt ansprechbar ist, durch direkten Vergleich mit dem Funktionsobjekt.

JavaScript hat auch einen Operator namens typeof, der ist für diesen Zweck aber ungeeignet, weil er bei Objekten immer "object" ermittelt.

Beispiel
Object.anzahl = 5;
const someObject = new Object();

console.log(someObject.constructor.name);         // "Object"
console.log(someObject.constructor.anzahl);       // 5 - nicht machen!
console.log(Object.anzahl);                       // 5 - so ist's besser.

console.log(someObject.constructor === Object);   // true - Nicht machen!
console.log(someObject instanceof Object);        // true - So ist's besser.

Das Beispiel erzeugt zunächst mit Hilfe des new-Operators ein neues Objekt. Dieses Objekt erhält das Objekt, das in Object.prototype zu finden ist, als Prototyp und erbt darüber die constructor Eigenschaft.

Diese Eigenschaft lässt sich nun verwenden, um beispielsweise den Namen der Konstruktorfunktion zu ermitteln oder um zu prüfen, ob ein Objekt exakt von dieser Konstruktorfunktion erzeugt wurde (und nicht von einer Konstruktorfunktion, die eine davon abgeleitete Klasse von Objekten erzeugt). Mehr sollten Sie damit nicht tun!

Beachten Sie: Wenn Sie keinen anderweitigen Zugriff auf die Konstruktorfunktion eines Objekts haben, ist die Verwendung der constructor-Eigenschaft, um sich diesen zu verschaffen, keine gute Idee. Konstruktorfunktionen sind üblicherweise global verfügbare Objekte, und wenn sie das aus irgendeinem Grund nicht sind, dann gibt es einen guten Grund dafür und man sollte sich nicht auf diesem Weg an die Konstruktorfunktion heranschleichen. Wenn Vererbung ins Spiel kommt, ist die Typbestimmung mittels constructor möglicherweise auch irreführend. Während instanceof auch dann true zurückgibt, wenn damit gegen die Basisklasse eines Objekts abgefragt wird, liefert der Vergleich mit constructor false.

Verhalten bei Vererbung

Wie eingangs erwähnt, besitzen alle Prototypobjekte eine Eigenschaft mit dem Namen constructor, das heißt, die Eigenschaft von Object.prototype wird bei Instanzen anderer Konstruktoren innerhalb der Prototypenkette durch die gleichnamigen Eigenschaften verdeckt, welche auf den Prototypobjekten dieser Konstruktoren definiert sind. Wird die Eigenschaft constructor also auf einem Objekt abgerufen, das nicht durch die Object-Funktion erstellt wurde, dann wird der Konstruktor referenziert, der dem direkten Prototypen dieses Objekts zugeordnet ist.

Beispiel
const liste = new Array(7);

console.log(typeof liste);                  // "object"
console.log(liste instanceof Object);       // true
console.log(liste instanceof Array);        // auch true!

console.log(liste.constructor === Object);  // false
console.log(liste.constructor === Array);   // true
console.log(liste.constructor.name);        // "Array"

Das Beispiel erzeugt ein Array-Objekt mit 7 Einträgen. Wie die erste Konsolenausgabe zeigt, ist ein Array auch eine Instanz von Object (der Prototyp von Array.prototype ist Object.prototype).

Die zweite Konsolenausgabe deckt aber auf, dass das Objekt der zutreffenden instanceof-Abfrage nicht durch diese Konstruktorfunktion erzeugt wurde. Der Prototyp des liste-Objekts ist Array.prototype, liste erbt die constructor-Eigenschaft von dort deshalb verweist liste.constructor auf die Array/code>-Konstruktorfunktion.

Weblinks