JavaScript/Objekte/Object/prototype

Aus SELFHTML-Wiki
Wechseln zu: Navigation, Suche

Über die Methoden des in der Eigenschaft prototype des Konstruktors Object hinterlegten Objektes wird ein Basissatz an Funktionalität bereitgestellt, der standardmäßig an alle anderen Objekte vererbt wird.


Syntax

Object.prototype


Attribute
Writable false
Enumerable false
Configurable false


Prototyp

  • null


Eigenschaften



Beschreibung

Auf dem Objekt, welches in der Eigenschaft prototype des eingebauten Konstruktors Object hinterlegt ist, sind mehrere Methoden und eine Eigenschaft definiert, die standardmäßig an alle Objekte vererbt werden und die entsprechend über jedes Objekt referenziert werden können, sofern sie nicht innerhalb der Kette der Prototypen durch gleichnamige Methoden und Eigenschaften anderer Objekte verschattet werden.


Beispiel
const object = {
  print (value) {
    console.log(value);
  }
};

object.print(object.hasOwnProperty('print')); // true


In diesem Beispiel wird zunächst in Literalschreibweise ein planes Objekt erzeugt, welches einer Konstante als Wert zugewiesen wird. Auf dem Objekt wird eine Methode mit einem formalen Parameter definiert, welche die Anweisung enthält, den Wert des Parameters in der Konsole auszugeben. Diese Methode wird im nächsten Schritt aufgerufen, wobei das Ergebnis des Aufrufs der Methode hasOwnProperty als Argument übergeben wird.


Die Methode hasOwnProperty wird ebenso wie die selbstdefinierte Methode print direkt auf dem zuvor erstellten Objekt aufgerufen, was möglich ist, weil das Objekt diese Methode von Object.prototype erbt. Der Methode hasOwnProperty wird bei ihrem Aufruf der Name der zuvor auf dem Objekt angelegten Methode übergeben und da es sich hier entsprechend um eine eigene Methode des Objektes handelt, wird von hasOwnProperty der boolesche Wert true zurückgegeben, der dann von print in die Konsole geschrieben wird.


Beispiel
const prototype = Object.getPrototypeOf({ });

console.log(Object.prototype === prototype); // true


In diesem Beispiel wird die Methode getPrototypeOf des Konstruktors Object aufgerufen und dabei ein planes Objekt als Argument übergeben. Die Methode getPrototypeOf gibt den Wert der internen Eigenschaft [[Prototype]] eines als Argument übergebenen Objektes zurück, also dessen direkten Vorfahren innerhalb der Prototypenkette. Da hier nun ein planes Objekt als Argument übergeben wurde, dessen Prototyp standardmäßig Object.prototype ist, wird entsprechend eine Referenz auf dieses Objekt zurückgegeben, was der abschließende Vergleich bestätigt.


Beispiel
const array = [ ];

console.log(typeof array.hasOwnProperty); // function


Wie hier zu sehen ist, werden die Methoden von Object.prototype jedoch nicht nur an plane Objekte vererbt, sondern grundsätzlich an alle eingebauten Objekte, also auch an Arrays. In diesem Fall ist der Prototyp des erzeugten Arrays zwar das prototypische Objekt des Konstruktors Array und nicht Object.prototype, letzteres ist jedoch der Prototyp von Array.prototype, sodass Arrayinstanzen im Ergebnis die Methoden von beiden Objekten erben.


Beispiel
const proto = Object.prototype;

console.log(Object.getPrototypeOf(proto)); // null


Der Prototyp von Object.prototype selbst ist der primitive Wert null, wie der Aufruf der Methode getPrototypeOf und die folgende Ausgabe des Ergebnisses in der Konsole zeigt. Das heißt, das in der Eigenschaft prototype des Konstruktors Object hinterlegte Objekt ist standardmäßig das vorletzte Glied in der Prototypenkette eines jeden Objektes, denn der Wert null ist kein Objekt und besitzt dem zur Folge keinen Prototypen.


Beispiel
const object = Object.create(null);

console.log(typeof object.hasOwnProperty); // undefined


Obschon grundsätzlich alle Objekte zumindest auch Instanzen des Konstruktors Object sind und Object.prototype entsprechend Teil der Prototypenkette aller Objekte ist, ist es dennoch möglich Objekte zu erstellen, welche nicht von Object.prototype erben. Hierzu kann wie in dem Beispiel oben die Methode create des Konstruktors Object verwendet werden, der beim Aufruf als erstes Argument der Wert übergeben wird, mit dem die interne Eigenschaft [[Prototype]] des von der Methode erzeugten Objektes initialisiert werden soll. Sie ermöglicht es also, explizit einen Prototypen für das neue Objekt zu bestimmen, bei dem es sich, ebenso wie bei Object.prototype selbst, auch um den Wert null handeln kann.


Wie die abschließende Ausgabe des Ergebnisses der Prüfung mit dem Operator typeof zeigt, kann die Methode hasOwnProperty auf dem erstellten Objekt nicht referenziert werden, da Object.prototype, auf dem die Methode definiert ist, nicht Teil der Prototypenkette des von create erzeugten Objektes ist. In diesem Fall werden also überhaupt keine Eigenschaften und Methoden an das Objekt vererbt.

Weblinks