JavaScript/Objekte/Object/constructor
Die Eigenschaft constructor von Object.prototype enthält eine Referenz auf den Konstruktor Object.
Syntax
Object.prototype.constructor
Writable | true |
Enumerable | false |
Configurable | true |
Inhaltsverzeichnis
Beschreibung[Bearbeiten]
Alle Objekte, die in der Eigenschaft prototype einer Funktion hinterlegt sind, besitzen eine Referenz auf das dazugehörige Funktionsobjekt, welche standardmäßig in der Eigenschaft constructor eines solchen prototypischen Objektes gespeichert ist. Über die Eigenschaft constructor von Object.prototype kann also der Konstruktor Object referenziert werden.
const constructor = Object.prototype.constructor;
console.log(constructor === Object); // true
Hier wird zunächst mit dem Wert der Eigenschaft constructor von Object.prototype eine Konstante initialisiert. Dieser Wert wird danach mit dem als globale Variable referenzierten Konstruktor Object verglichen und das Ergebnis in der Konsole ausgegeben. Dabei zeigt sich, dass die Eigenschaft constructor hier tatsächlich auf den Konstruktor Object verweist. Da die Eigenschaft constructor wie alle Eigenschaften und Methoden eines prototypischen Objektes an die vom jeweiligen Konstruktor erzeugten Instanzen vererbt wird, kann sie dem zur Folge auch direkt auf diesen Objekten angesprochen werden.
const object = { };
console.log(object.constructor.name); // Object
Wird also wie in diesem Beispiel ein planes Objekt erzeugt, dann erbt es von Object.prototype die Eigenschaft constructor, welche wie gesehen eine Referenz auf den Konstruktor Object enthält. Dieser wiederum besitzt wie alle Funktionsobjekte eine Eigenschaft name, welche einen String mit dem Namen der Funktion enthält, hier also die Zeichenkette Object. Dies ist entsprechend der Wert, der durch den Aufruf der Methode log in die Konsole geschrieben wird.
Gleichnamige Eigenschaften[Bearbeiten]
Wie eingangs erwähnt, besitzen alle prototypischen Objekte 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 verschattet, welche auf den prototypischen Objekten dieser Konstruktoren definiert sind. Wird die Eigenschaft constructor also auf einem Instanzobjekt angesprochen, bei dem es sich nicht um ein planes Objekt handelt, dann wird entsprechend der Konstruktor referenziert, dessen prototypisches Objekt innerhalb der jeweiligen Prototypenkette der Instanz am nächsten ist, und nicht der Konstruktor Object.
const number = new Number(42);
console.log(number instanceof Object); // true
console.log(number.constructor.name); // Number
In diesem Beispiel wird zunächst durch den Aufruf des Konstruktors Number ein Objekt erzeugt. Im Folgenden wird dann unter Verwendung des Operators instanceof geprüft, ob es sich bei dem Objekt um eine Instanz des Konstruktors Object handelt. Da grundsätzlich alle Objekte Instanzen dieses Konstruktors sind, sofern nicht ausdrücklich etwas anderes bestimmt wurde, wird als Ergebnis dieser Prüfung true in die Konsole geschrieben. Bei der abschließenden Ausgabe des Wertes der Eigenschaft constructor des Objektes wird jedoch der spezifischere Konstruktor Number referenziert und nicht der Konstruktor Object, da die Eigenschaft constructor von Object.prototype innerhalb der Prototypenkette des Objektes durch die gleichnamige Eigenschaft von Number.prototype verschattet wird.
Typbestimmung[Bearbeiten]
Da beim Zugriff auf die Eigenschaft constructor auf Instanzobjekten wie gesehen immer derjenige Konstruktor referenziert wird, dessen prototypisches Objekt in der jeweiligen Prototypenkette der Instanz am nächsten ist, kann die Eigenschaft dazu verwendet werden, den Typ eines Objektes zu bestimmen.
function getType (object) {
return object.constructor.name;
}
console.log(getType([ ])); // Array
console.log(getType({ })); // Object
In diesem Beispiel wird eine Funktion mit dem Bezeichner getType deklariert, welche die Anweisung enthält, den Namen des über die Eigenschaft constructor referenzierten Konstruktors eines als Argument übergebenen Objektes zurückzugeben. Wird sie also zum Beispiel mit einem Arrayobjekt aufgerufen, dann wird über die Eigenschaft constructor der Konstruktor Array referenziert und eine entsprechende Zeichenkette zurückgegeben. Bei einem planen Objekt ist der Rückgabewert hingegen der String Object.
Weblinks[Bearbeiten]
- ECMAScript 2017 (7th Edition, ECMA-262 Draft): Object.prototype.constructor
- ECMAScript 2015 (6th Edition, ECMA-262): Object.prototype.constructor