Die get Syntax bindet eine Objekteigenschaft an eine Funktion welche aufgerufen wird, wenn die Eigenschaft abgefragt wird.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
Syntax
{get prop() { ... } }
{get [expression]() { ... } }
Parameter
prop- Der Name der Eigenschaft, die an die gegebene Funktion gebunden wird.
- expression
- Beginnend mit ECMAScript 2015, kann auch ein Ausdruck für einen berechneten Eigenschaftsnamen genutzt werden, der an die Funktion gebunden wird.
Beschreibung
Manchmal ist es wünschenswert, den Zugriff auf eine Eigenschaft zuzulassen, die einen dynamisch berechneten Wert zurückgibt oder man möchten den Status einer internen Variablen widerspiegeln, ohne dass explizite Methodenaufrufe erforderlich sind. In JavaScript kann dieses mit einem getter erreicht werden. Es ist nicht möglich, dass ein Getter gleichzeitig an eine Eigenschaft gebunden ist und diese Eigenschaft tatsächlich einen Wert enthält, obwohl es möglich ist, einen Getter und einen Setter in Verbindung zu verwenden, um einen Pseudoeigenschaftstyp zu erstellen.
Folgendes ist zu beachten, wenn die get Syntax verwendet wird:
- Sie kann ein Bezeichner haben, welche entweder eine Zahl oder ein String ist.
- Sie muss exakt null Parameter haben (siehe Incompatible ES5 change: literal getter and setter functions must now have exactly zero or one arguments für mehr Informationen);
- Es darf nicht in einem Objektliteral mit einem anderen
getoder Dateneintrag für die gleiche Eigenschaft benutzt werden ({ get x() { }, get x() { } }und{ x: ..., get x() { } }sind verboten).
Ein Getter kann mit dem delete Operator entfernt werden.
Beispiele
Definition eines Getters in einem neuen Objekt in der Objektinitialisierung
Folgendes erstellt eine Pseudoeigenschaft latest für das Objekt obj, welche dan letzte Arrayeintrag von log zurückgibt.
var obj = {
log: ['example','test'],
get latest() {
if (this.log.length == 0) return undefined;
return this.log[this.log.length - 1];
}
}
console.log(obj.latest); // "test".
Zu beachten ist, dass die Zuweisung eines Wertes auf latest keine Änderung bewirkt.
Löschen eines Getters mit dem delete Operator
Wenn ein Getter gelöscht werden soll, kann einfach delete benutzt werden:
delete obj.latest;
Definition eines Getter auf einem existierenden Objektes mit defineProperty
Um einem Getter später zu einem existierenden Objekt hinzuzufügen, kann jederzeit Object.defineProperty() benutzt werden.
var o = {a: 0};
Object.defineProperty(o, 'b', { get: function() { return this.a + 1; } });
console.log(o.b) // Runs the getter, which yields a + 1 (which is 1)
Einen berechneten Eigenschaftnamen benutzen
var expr = 'foo';
var obj = {
get [expr]() { return 'bar'; }
};
console.log(obj.foo); // "bar"
Intelligente / Selbstüberschreibende / Lazy Getter
Mit Gettern können Sie eine Eigenschaft eines Objekts definieren, sie berechnen jedoch nicht den Wert der Eigenschaft, bis auf sie zugegriffen wird. Ein Getter verschiebt die Kosten für die Berechnung des Werts, bis der Wert benötigt wird, und wenn sie nie benötigt wird, zahlt man nie die Kosten.
Eine weitere Optimierungstechnik, um die Berechnung eines Eigenschaftswerts zu verzögern und ihn für einen späteren Zugriff zwischenzuspeichern, sind intelligente oder memoisierte Getter. Der Wert wird berechnet, wenn der Getter das erste Mal aufgerufen wird und wird dann zwischengespeichert, damit nachfolgende Zugriffe den zwischengespeicherten Wert zurückgeben, ohne ihn neu zu berechnen. Dies ist in den folgenden Situationen nützlich:
- Wenn die Berechnung eines Eigenschaftswerts teuer ist (erfordert viel RAM- oder CPU-Zeit, erzeugt einen Worker-Thread, ruft eine Remote-Datei ab usw.).
- Wenn der Wert gerade nicht benötigt wird. Er wird später verwendet oder in einigen Fällen wird er überhaupt nicht verwendet.
- Wenn er verwendet wird, wird mehrmals darauf zugegriffen und er ist nicht erforderlich, den Wert neu zu berechnen, da er nie geändert oder nicht neu berechnet wird.
Dies bedeutet, dass keine verzögerten Getter für eine Eigenschaft verwenden werden sollten, deren Wert sich voraussichtlich ändern wird, da der Getter den Wert nicht neu berechnet.
Im folgenden Beispiel hat das Objekt einen Getter als eigene Eigenschaft. Beim Abrufen der Eigenschaft wird die Eigenschaft aus dem Objekt entfernt und erneut hinzugefügt, diesmal jedoch implizit als Dateneigenschaft. Abschließend wird der Wert zurückgegeben.
get notifier() {
delete this.notifier;
return this.notifier = document.getElementById('bookmarked-notification-anchor');
},
Für Firefox Code sollte zusätzlich das XPCOMUtils.jsm Code Modul angeschaut werden, welches die defineLazyGetter() Funktion definiert.
get vs. defineProperty
Das get Schlüsselwort und Object.defineProperty() haben ähnliche Ergebnisse. Es gibt einen kleinen Unterschied zwischen beiden, wenn classes eingesetzt werden.
Wenn get eingesetzt wird, wird die Eigenschaft im Prototyp definiert während beim Einsatz von Object.defineProperty() die Eigenschaft auf der Instanz definiert wird.
class Example {
get hello() {
return 'world';
}
}
const obj = new Example();
console.log(obj.hello);
// "world"
console.log(Object.getOwnPropertyDescriptor(obj, 'hello'));
// undefined
console.log(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(obj), 'hello'));
// { configurable: true, enumerable: false, get: function get hello() { return 'world'; }, set: undefined }
Spezifikationen
| Spezifikation | Status | Kommentar |
|---|---|---|
| ECMAScript 5.1 (ECMA-262) Die Definition von 'Object Initializer' in dieser Spezifikation. |
Standard | Initiale Definition. |
| ECMAScript 2015 (6th Edition, ECMA-262) Die Definition von 'Method definitions' in dieser Spezifikation. |
Standard | Berechnete Eigenschaftsnamen hinzugefügt. |
| ECMAScript Latest Draft (ECMA-262) Die Definition von 'Method definitions' in dieser Spezifikation. |
Entwurf |
Browserkompatibilität
| Desktop | Mobile | Server | |||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
get | Chrome Vollständige Unterstützung 1 | Edge Vollständige Unterstützung 12 | Firefox Vollständige Unterstützung 2 | IE Vollständige Unterstützung 9 | Opera Vollständige Unterstützung 9.5 | Safari Vollständige Unterstützung 3 | WebView Android Vollständige Unterstützung 1 | Chrome Android Vollständige Unterstützung 18 | Firefox Android Vollständige Unterstützung 4 | Opera Android Vollständige Unterstützung Ja | Safari iOS Vollständige Unterstützung Ja | Samsung Internet Android Vollständige Unterstützung 1.0 | nodejs Vollständige Unterstützung Ja |
| Computed property names | Chrome Vollständige Unterstützung 46 | Edge Vollständige Unterstützung 12 | Firefox Vollständige Unterstützung 34 | IE Keine Unterstützung Nein | Opera Vollständige Unterstützung 47 | Safari Keine Unterstützung Nein | WebView Android Vollständige Unterstützung 46 | Chrome Android Vollständige Unterstützung 46 | Firefox Android Vollständige Unterstützung 34 | Opera Android Vollständige Unterstützung Ja | Safari iOS Keine Unterstützung Nein | Samsung Internet Android Vollständige Unterstützung 5.0 | nodejs Vollständige Unterstützung Ja |
Legende
- Vollständige Unterstützung
- Vollständige Unterstützung
- Keine Unterstützung
- Keine Unterstützung
Siehe auch
- setter
deleteObject.defineProperty()__defineGetter____defineSetter__- Defining Getters and Setters im JavaScript Guide