Objekt Initialisierer

Dieser Artikel benötigt eine redaktionelle Überprüfung. So können Sie helfen.

Diese Übersetzung ist unvollständig. Bitte helfen Sie, diesen Artikel aus dem Englischen zu übersetzen.

Zusammenfassung

Objekte können mittels new Object(), Object.create(), oder über die literale Notation (Initialisierungs Notaion) initialisiert werden. Ein Objekt Initialisierer ist eine Liste bestehend aus Null oder mehr Paaren von Eigenschafts-Namen und den zugehörigen Werten eines Objektes, eingeschlossen in geschwungene Klammern ({}).

Syntax

var o = {};
var o = { a: "foo", b: 42, c: {} };

var a = "foo", b = 42, c = {};
var o = { a: a, b: b, c: c };

var o = {
  property: function ([parameters]) {},
  get property() {},
  set property(value) {},
};

Neue Schreibweisen in ECMAScript 6

Um herauszufinden ob diese Schreibweisen (im folgenden Notation genannt) unterstützt werden, werfen Sie einen Blick auf die Kompatibilitäts Tabelle. In nicht-unterstützenden Umgebungen werden diese Schreibweisen zu Syntax Fehlern führen.

// Kurzschreibweisen für Eigenschaftsnamen (ES6)
var a = "foo", b = 42, c = {};
var o = { a, b, c };

// Kurzschreibweise Methoden Namen (ES6)
var o = {
  property([parameters]) {},
  get property() {},
  set property(value) {},
  * generator() {}
};

// Berechnete Eigenschaftsnamen (ES6)
var prop = "foo";
var o = {
  [prop]: "hey",
  ["b" + "ar"]: "there",
};

Beschreibung

Ein Objekt Initialisierer ist ein Ausdruck welcher die Initialisierung eines Object beschreibt. Objekte bestehen aus Eigenschaften (properties), welche verwendet werden, um ein Objekt zu beschreiben. Die Werte der Objekt Eigenschaften können primitive Datentypen oder andere Objekte enthalten.

Objekte erzeugen

Ein leeres Objekt ohne Eigenschaften kann wie folgt erzeugt werden:

var object = {};

Jedoch: die Vorteile der literalen oder Initialisierer Notation versetzen Sie in die Lage, Objekte inklusive Eigenschaften, innerhalb geschwungener Klammern, schneller zu erzeugen. Sie schreiben einfach eine Liste von Schlüssel:Werte Paaren, getrennt durch ein Komma. Der folgende Quellcode erzeugt ein Objekt mit drei Eingenschaften mit den Schlüsseln "foo", "age" und "baz". Die Werte dieser Schlüssel sind: die Zeichenkette "bar", die Zahl 42 und die dritte Eigenschaft hat ein anderes Objekt als Wert.

var object = {
  foo: "bar",
  age: 42,
  baz: { myProp: 12 },
}

Auf Eigenschaften zugreifen

Sobal ein Objekt erzeugt worden ist, möchte man auf seine Eigenschaften lesend oder schreibend zugreifen. Auf die Eigenschaften eines Objektes kann mit der Punktnotation oder der Klammer-Notation zugegriffen werden. Siehe property accessors für weiter Informationen.

object.foo; // "bar"
object["age"]; // 42

object.foo = "baz";

Eigenschaften definieren

Wir haben bereits gelernt, wie man Eigenschaften mit Hilfe der Initialisierungs Syntax schreibt. Oft gibt es Variablen im Code, die Sie in einem Objekt verwenden möchten. Man sieht oft Quellcode wie den folgenden:

var a = "foo", 
    b = 42,
    c = {};

var o = { 
  a: a,
  b: b,
  c: c
};

Mit ECMAScript 6 ist eine kürzere Schreibweise verfügbar, um das gleiche zu erreichen:

var a = "foo", 
    b = 42, 
    c = {};

// Shorthand property names (ES6)
var o = { a, b, c };

Doppelte Eigenschaftsnamen

Bei Verwendung des gleichen Namens für Ihre Eigenschaften, wird die zweite Eigenschaft die erste überschreiben.

var a = {x: 1, x: 2};
console.log(a); // { x: 2}

Im strikten Modus von ECMAScript 5 wurden doppelte Eigenschaftsnamen als SyntaxError gewertet. Mit der Einführung von berechneten Eigenschaftsnamen in ECMAScript 6 wurde diese Einschränkung entfernt, was Duplikate zur Laufzeit möglich macht.

function haveES6DuplicatePropertySemantics(){
  "use strict";
  try {
    ({ prop: 1, prop: 2 });

    // No error thrown, duplicate property names allowed in strict mode
    return true;
  } catch (e) {
    // Error thrown, duplicates prohibited in strict mode
    return false;
  }
}

Methoden Definitionen

Eine Eigenschaft eines Objekts kann auch auf eine Funktion oder einen Getter oder Setter-Methode verweisen.

var o = {
  property: function ([parameters]) {},
  get property() {},
  set property(value) {},
};

In ECMAScript 6, a shorthand notation is available, so that the keyword "function" is no longer necessary.

// Kurzschreibweise für Methoden Namen (ES6)
var o = {
  property([parameters]) {},
  get property() {},
  set property(value) {},
  * generator() {}
};

Für weiter Information und Beispiel zu Methoden, siehe method definitions.

Berechnete Bezeichnernamen

Beginnend mit ECMAScript 6, unterstützt die Objekt Initialisierer Syntax auch berechnete Bezeichnernamen für Objekt Eigenschaften. Das gestatt dem Programmierer einen Ausdruck in eckigen Klammern anzugeben, aus welchem der Bezeichnernamen für die Objekt Eigenschaft berechnet wird. Die Schreibweise dafür ist analog zu der Klammer-Notation für den Zugriff auf Objekt Eigenschaften welche Sie bereits benutzt haben. Dieselbe Syntax kann nun für Eigenschaften Bezeichner verwendet werden:

// Computed property names (ES6)
var i = 0;
var a = {
  ["foo" + ++i]: i,
  ["foo" + ++i]: i,
  ["foo" + ++i]: i
};

console.log(a.foo1); // 1
console.log(a.foo2); // 2
console.log(a.foo3); // 3

var param = 'size';
var config = {
  [param]: 12,
  ["mobile" + param.charAt(0).toUpperCase() + param.slice(1)]: 4
};

console.log(config); // { size: 12, mobileSize: 4 }

Prototyp Mutationen

Eine Eigenschaft Definition der Form __proto__: Wert oder "__proto__": Wert erzeugt keine Eigenschaft mit dem Namen __proto__. Wenn der angegebene Wert ein Objekt oder null ist, wird stattdessen der [[Prototyp]] des erzeugten Objektes auf den angegebenen Wert geändert. (Das Objekt wird nicht verändert, falls der Wert kein Objekt oder null ist.)

var obj1 = {};
assert(Object.getPrototypeOf(obj1) === Object.prototype);

var obj2 = { __proto__: null };
assert(Object.getPrototypeOf(obj2) === null);

var protoObj = {};
var obj3 = { "__proto__": protoObj };
assert(Object.getPrototypeOf(obj3) === protoObj);

var obj4 = { __proto__: "not an object or null" };
assert(Object.getPrototypeOf(obj4) === Object.prototype);
assert(!obj4.hasOwnProperty("__proto__"));

Pro Objekt-Literal ist nur eine einzlene Prototyp mutation erlaubt: mehrfache Prototyp Mutationen führen zu einem Syntax Fehler.

Eigenschaftsdefinitionen welche nicht von der Doppelpunkt Notation Gebrauch machen, sind keine Prototyp Mutationen: es sind Eigenschaftsdefinitionen die sich verhalten wie jede andere Defintion von Eigenschaftsbezeichnern auch.

var __proto__ = "variable";

var obj1 = { __proto__ };
assert(Object.getPrototypeOf(obj1) === Object.prototype);
assert(obj1.hasOwnProperty("__proto__"));
assert(obj1.__proto__ === "variable");

var obj2 = { __proto__() { return "hello"; } };
assert(obj2.__proto__() === "hello");

var obj3 = { ["__prot" + "o__"]: 17 };
assert(obj3.__proto__ === 17);

Objekt literale Notation vs JSON

Die Objekt-Literal Notation ist nicht dasselbe wie die JavaScript Object Notation (JSON). Obwohl sie ähnlich aussehen, gibt es Unterschiede zwischen ihnen:

  • JSON erlaubt nur Eigenschaftsdefinitionen mit "Eigenschaft": Wert Syntax. Der Eigenschaftsname muss in doppelten Anführungszeichen geschrieben werden, und die Definition kann nicht in Kurzschreibweise erfolgen.
  • In JSON können die Werte nur Strings, Zahlen, Arrays, true, false, null oder  andere (JSON) Objekte sein.
  • Ein Funktionswert (siehe "Methoden" oben) kann in JSON keinem Wert zugeordnet werden.
  • Objekte wie {{jsxref ("Date")}} werden nach dem Aufruf von {{jsxref ("JSON.parse ()")}}, in einen String umgewandelt, .
  • JSON.parse() weist berechnete Eigenschaftsnamen zurück und wirft eine Fehlermeldung.

Spezifizierung

Spezifizierung Status Kommentar
ECMAScript 1te Ausgabe. Standard Ausgangsdefinition.
ECMAScript 5.1 (ECMA-262)
Die Definition von 'Object Initializer' in dieser Spezifikation.
Standard Getter und setter hinzugefügt.
ECMAScript 6 (ECMA-262)
Die Definition von 'Object Initializer' in dieser Spezifikation.
Anwärter Empfehlung Kurzschreibweise für Methoden-/Eigenschaftsnamen und berechnete Eigenschaftsnamen hinzugefügt.

Browser kompatibilität

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
grundlegende Unterstützung 1 1.0 (1.7 oder früher) 1 1 1
Berechnete Eigenschafts Bezeichner Nicht unterstützt 34 (34) Nicht unterstützt Nicht unterstützt Nicht unterstützt
Kurzschrift für Eigenschafts Bezeichner Nicht unterstützt 33 (33) Nicht unterstützt Nicht unterstützt Nicht unterstützt
Kurzschrift für Methodennamen Nicht unterstützt 34 (34) Nicht unterstützt Nicht unterstützt Nicht unterstützt
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
grundlegende Unterstützung 1 1 1.0 (1.0) 1 1 1
Berechnete Eigenschafts Bezeichner Nicht unterstützt Nicht unterstützt 34.0 (34) Nicht unterstützt Nicht unterstützt Nicht unterstützt
Kurzschrift für Eigenschaftsnamen Nicht unterstützt Nicht unterstützt 33.0 (33) Nicht unterstützt Nicht unterstützt Nicht unterstützt
Kurzschrift für Methodennamen Nicht unterstützt Nicht unterstützt 34.0 (34) Nicht unterstützt Nicht unterstützt Nicht unterstützt

Siehe auch

Schlagwörter des Dokuments und Mitwirkende

 Mitwirkende an dieser Seite: siggi-heltau
 Zuletzt aktualisiert von: siggi-heltau,