Objekte

Objekte sind genauso wie alle Primitive ein Datentyp mit einem kritischen Unterschied: Im Gegensatz zu Primitiven sind Objekte veränderbar. Ein Objekt kann wie eine Variable Daten enthalten, die mit Kennungen verknüpft sind, behält aber den Datentyp object bei, unabhängig davon, welche Daten es enthält.

Abgesehen von primitiven Werten sind alle JavaScript-Werte Objekte. Da selbst primitive Literale aufgrund der prototypischen Übernahme objektähnliches Verhalten zeigen, wird oft behauptet, dass JavaScript im Grunde aus Objekten besteht.

Ein Objektliteral ist ein Paar geschweifte Klammern, die null oder mehr Schlüssel/Wert-Paare umgeben, die als „Eigenschaften“ bezeichnet werden und einen beliebigen JavaScript-Wert enthalten können.

{
    "myProperty" : true
}

Attribut-Schlüssel können ein beliebiges Symbol oder String sein. Wie beim Zuweisen einer Kennung zu einer Variablen sollten auch die als Attributschlüssel verwendeten Strings vorhersehbar und beschreibend sein:

let carAttributes = {
    "color" : "red"
};

carAttributes
> Object { color: "red" }

Attributschlüssel erfordern ein einzelnes Stringliteral (') oder doppelte Anführungszeichen ("), kein Vorlagenliteral:

let carAttributes = {
    `keyString` : false
};
> Uncaught SyntaxError: expected property name, got template literal

Attributwerte können einen beliebigen Datentyp haben. Die Eigenschaften eines Objekts können wiederum Objekte mit eigenen Eigenschaften enthalten:

let myObject = {
    'key' : {
        'subkey' : true,
        'othersubkey' : false
    }
};

myObject;
> Object { key: Object { subkey: true, othersubkey: false } }

Wenn der Wert einer Eigenschaft eine Funktion ist, wird diese Eigenschaft als „Methode“ bezeichnet.

const myObject = {
    "myProperty" : true,
    myMethod() {
        console.log( "This is a method." );
    }
}

myObject.myProperty;
> true

myObject.myMethod();
> "This is a method."

Sie können ein Objekt auch mit dem Schlüsselwort new erstellen:

let myObject = new Object();

In den vorherigen Beispielen wurden die neu erstellten Objektliterale Variablen zugewiesen. Dies ist nicht erforderlich, da Sie wie jeden anderen Datentyp überall dort ein Objekt ohne Kennung verwenden können, wo ein Objekt erwartet wird. Ein Objektliteral erfordert jedoch Klammern in jedem Kontext, in dem es für eine Blockanweisung verwechselt werden könnte, da die beiden geschweiften Klammern ({}) dieselbe Syntax haben. Dies ist für die Initialisierung einer Variablen nicht erforderlich.

{ "value" : 2 }
> Uncaught SyntaxError: unexpected token: ':'

({ "value" : 2 })
> Object { value: 2 }

let valObj = { "value" : 2 };

valObj;
> Object { value: 2 }

Im Gegensatz zu Primitiven gibt es keinen bedeutenden Unterschied in den Ergebnissen, wenn Sie ein Objekt mit new Object() erstellen und ein Objektliteral erstellen, da das Ergebnis in beiden Fällen ein Objekt mit Eigenschaften sein, die vom Object-Prototyp übernommen wurden. Es gibt jedoch einen praktischen Unterschied zwischen den beiden Syntaxen.

Mit dem Schlüsselwort new muss ein leeres Objekt definiert werden, das später mit Daten gefüllt wird:

let myObject = new Object();

myObject.booleanValue = true;
myObject.stringValue = "My string.";

Ein Objektliteral kann beim Erstellen mit Daten gefüllt werden:

let myObject = {
    'booleanValue' : true,
    'stringValue' : "My string."
};

Obwohl es nur wenig praxistauglich ist, kann new Object() verwendet werden, um primitive Datenwerte in Objekte ihres jeweiligen Typs umzuwandeln, z. B. solche, die mithilfe des Schlüsselworts new zusammen mit der Funktion Konstruktor zurückgegeben werden. Die folgende Funktion entspricht beispielsweise new Number( 10 ):

let myObject = new Object( 10 );

myObject;
> Number { 10 }

Die Werte null und undefined führen zu einem leeren Objekt, das funktional identisch mit dem Aufruf von new Object() ohne Angabe eines Arguments ist.

Bei Übergabe eines Objektliterals an new Object() als Argument wird das Objektliteral übergeben, ohne es zu ändern:

let myObject = new Object( { myValue : 10 } );

myObject;
> Object { myValue: 10 }

Wie die Verwendung von Konstruktoren für primitive Werte bietet die Verwendung von Konstruktoren für Objekte gegenüber der Verwendung der Objektliteralnotation selten Vorteile. Selbst wenn leere Objekte erstellt werden, die später mit Werten befüllt werden können, bevorzugen Entwickler der Einfachheit halber die Objektliteral-Notation.

Wissen testen

Welche Arten von Notation können Sie verwenden, um die Eigenschaften eines Objekts festzulegen?

Punktnotation
Klammernotation
Punktschreibweise
Liniennotation

Welche der folgenden Syntax ist die richtige Syntax zum Abrufen des Werts von myProp

myObj["myProp"];
myObj{"myProp"};
myObj("myProp");