JavaScript/Objekte/Object/constructor
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
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.
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!
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.
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
- ECMAScript Spezifikation (ECMA-262): Object.prototype.constructor
- MDN: Object.prototype.constructor