Der new Operator erzeugt eine Instanz eines benutzerdefinierten Objekttyps oder eines Standardtyps, welcher eine Konstruktorfunktion besitzt.

Syntax

new constructor[([arguments])]

Parameter

constructor
Eine Funktion, welche den Typ der Objektinstanz spezifiziert.
arguments
Eine Liste von Werten, die dem constructor übergeben wird.

Beschreibung

Das erstellen eines benutzerdefinierten Objektes benötigt zwei Schritte:

  1. Definieren eines Objekttypen indem eine Funktion geschrieben wird.
  2. Erstellen einer Instanz des Objektes mit new.

Um ein neuen Objekttypen zu definieren, erstellt man eine Funktion für den Objekttypen, die seinen Namen und Eigenschaften spezifiziert. Ein Objekt kann Eigenschaften haben, die ebenfalls Objekte sind. Sie dazu das Beispiel unten.

Wenn der Code new Foo(...) ausgeführt wird, passieren folgende Dinge:

  1. Ein neues Objekt wird erstellt, welches von Foo.prototype erbt.
  2. Die Konstruktorfunktion Foo wird mit den spezifizierten Argumenten aufgerufen und this wird an das neu erstellte Objekt gebunden. new Foo ist gleichbedeutend mit new Foo(), d. h. wenn keine Argumentenliste spezifiziert ist, wird Foo ohne Argumente aufgerufen.
  3. Das Objekte, welches von der Konstruktorfunktion zurückgegeben wird, wird das Resultat des ganzen new Ausdrucks. Wenn die Konstruktorfunktion nicht explizit ein Objekte zurück gibt, wird stattdessen das erstellt Objekt aus Schritt 1 zurückgegeben. (Normalerweise geben Konstruktoren keinen Wert zurück, aber sie können es tun, um den normalen Objekterstellungsprozess zu überschreiben.)

Man kann immer eine Eigenschaft zu dem vorher erstellt Objekt hinzufügen. Zum Beispiel fügt das Statement auto1.farbe = "schwarz" die Eigenschaft farbe zu auto1 hinzu und weist dieser den Wert "schwarz" zu. Jedoch hat das keinen Effekt auf andere Objekte. Um die Eigenschaft zu allen Objekten des selben Typs hinzuzufügen, muss die Eigenschaft dem Auto Objekttypen hinzugefügt werden.

Man kann eine geteilte Eigenschaft zum vorher definierten Objekttypen hinzufügen, indem die Function.prototype Eigenschaft genutzt wird. Diese definiert eine geteilte Eigenschaft mit allen Objekten, die mit der gleichen Funktion erstellt wurde, und nicht nur bei einer Instanz des Objekttypen. Der folgende Code fügt die farbe Eigenschaft mit dem Wert "originale Farbe" zu allen Objekten des Typs Auto hinzu und überschreibt diesen Wert mit dem String "schwarz" nur in dem Instanzobjekt auto1. Für weitere Informationen siehe Prototype.

function Auto() {}
auto1 = new Auto();
auto2 = new Auto();
 
console.log(auto1.farbe);    // undefined
 
Auto.prototype.farbe = "originale Farbe";
console.log(auto1.farbe);    // originale Farbe
 
auto1.farbe = "schwarz";
console.log(auto1.farbe);   // schwarz

console.log(auto1.__proto__.farbe); // originale Farbe
console.log(auto2.__proto__.farbe); // originale Farbe
console.log(auto1.farbe);           // schwarz
console.log(auto2.farbe);           // originale Farbe

Wenn man den new Operator nicht benutzt, wird die Konstruktorfunktion wie eine normale Funktion ausgeführt, ohne ein Objekt zu erstellen. In diesem Fall ist der Wert von this ebenfalls anders.

Beispiele

Objekttyp und Objektinstanz

Angenommen man möchte ein Objekttypen für Autos erstellen, man möchte den Objekttypen Auto nennen und man möchte Eigenschaften für die Marke, das Modell und das Jahr haben. Um das zu erreichen muss folgende Funktion geschrieben werden:

function Auto(marke, modell, jahr) {
  this.marke = marke;
  this.modell = modell;
  this.jahr = jahr;
}

Nun kann man ein Objekt mit dem Namen meinAuto wie folgt erstellen:

var meinAuto = new Auto("Eagle", "Talon TSi", 1993);

Dieses Statement erstellt meinAuto und wiest die spezifizierten Werte den Eigenschaften zu. Dann ist der Wert von meinAuto.marke der String "Eagle", von meinAuto.jahr die Zahl 1993 und so weiter.

Man kann beliebig viele Objekte von Auto mit new erstellen. Zum Beispiel:

var kensAuto = new Auto("Nissan", "300ZX", 1992);

Objekteigenschaft, die selber ein Objket

Angenommen man Definiert ein Objekt mit dem Namen Person wie folgt:

function Person(name, alter, geschlecht) {
  this.name = name;
  this.alter = alter;
  this.geschlecht = geschlecht;
}

Dann instantiiert man zwei neue Person Objekte wie folgt:

var rand = new Person("Rand McNally", 33, "M");
var ken = new Person("Ken Jones", 39, "M");

Dann erneuert man die Definition von Auto um eine besitzer Eigenschaft , die ein Person Objekt ist, wie folgt:

function Auto(marke, modell, jahr, besitzer) {
  this.marke = marke;
  this.modell = modell;
  this.jahr = jahr;
  this.besitzer = besitzer;
}

Um das neue Objekt zu instantiiert benutzt man dann folgendes:

var auto1 = new Auto("Eagle", "Talon TSi", 1993, rand);
var auto2 = new Auto("Nissan", "300ZX", 1992, ken);

Statt ein Stringliteral oder einen Zahlenwert beim erstellen zu benutzen, übergibt das obere Beispiel die Objekte rand und ken als Parameter für den Besitzer. Um den Namen des Besitzers von auto2 zu erfahren, muss man die Eigenschaft wie folgt abfragen:

auto2.besitzer.name

Spezifikationen

Spezifikation Status Kommentar
ECMAScript Latest Draft (ECMA-262)
Die Definition von 'The new Operator' in dieser Spezifikation.
Entwurf  
ECMAScript 2015 (6th Edition, ECMA-262)
Die Definition von 'The new Operator' in dieser Spezifikation.
Standard  
ECMAScript 5.1 (ECMA-262)
Die Definition von 'The new Operator' in dieser Spezifikation.
Standard  
ECMAScript 3rd Edition (ECMA-262)
Die Definition von 'The new Operator' in dieser Spezifikation.
Standard  
ECMAScript 1st Edition (ECMA-262)
Die Definition von 'The new Operator' in dieser Spezifikation.
Standard Initiale Definition. Implementiert in JavaScript 1.0.

Browserkompatibilität

FunktionChromeEdgeFirefoxInternet ExplorerOperaSafari
Grundlegende Unterstützung Ja Ja1 Ja Ja Ja
FunktionAndroid webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
Grundlegende Unterstützung Ja Ja Ja4 Ja Ja Ja

Siehe auch

Schlagwörter des Dokuments und Mitwirkende

Mitwirkende an dieser Seite: schlagi123, Maugo, michiruckstuhl, danbru1211
Zuletzt aktualisiert von: schlagi123,