Signatur
Beschreibung
Mit __defineGetter__() legen Sie auf einem Objekt eine Accessor-Eigenschaft an. Liest jemand die Eigenschaft, wird die übergebene Funktion aufgerufen. Ihr Rückgabewert ist dann der Wert der Eigenschaft. Innerhalb der Funktion zeigt this auf das Objekt, über das zugegriffen wird.
Die Methode stammt aus der Zeit vor ES5. Damals gab es noch keine Getter-Syntax und kein Object.defineProperty(). Sie ist heute veraltet und steht nur noch aus Kompatibilitätsgründen im Anhang B der Spezifikation (ECMAScript-Erweiterungen für Webbrowser). Intern entspricht sie ungefähr diesem Aufruf: Object.defineProperty(obj, prop, { get: func, enumerable: true, configurable: true }).
In neuem Code sollten Sie stattdessen die Getter-Syntax get prop() { … } in Objektliteralen und Klassen verwenden. Wenn Sie einen Getter nachträglich oder dynamisch anlegen wollen, nutzen Sie Object.defineProperty(). Die Methode ist vor allem nützlich, wenn Sie alten Code lesen oder pflegen müssen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $prop Pflicht | string | symbol | Name der Eigenschaft, die an den Getter gebunden wird. Andere Werte werden in einen Eigenschaftsschlüssel umgewandelt. | |
| $func Pflicht | Function | Funktion, die bei jedem Lesezugriff aufgerufen wird. Sie erhält keine Argumente, this ist das Objekt, über das zugegriffen wird. Ihr Rückgabewert ist der Wert der Eigenschaft. Ist func keine Funktion, wird ein TypeError geworfen. |
Rückgabewert
undefined).Beispiele
Einfacher Getter auf einem bestehenden Objekt
const benutzer = { vorname: 'Anna', nachname: 'Schmidt' };
benutzer.__defineGetter__('vollerName', function () {
return `${this.vorname} ${this.nachname}`;
});
console.log(benutzer.vollerName);
benutzer.vorname = 'Lena';
console.log(benutzer.vollerName);
Moderne Alternativen mit gleichem Verhalten
// 1) Getter-Syntax im Objektliteral
const warenkorb = {
positionen: [19.99, 5.5, 12],
get summe() {
return this.positionen.reduce((a, b) => a + b, 0).toFixed(2);
}
};
// 2) Object.defineProperty – entspricht __defineGetter__
const alt = { positionen: [1, 2, 3] };
Object.defineProperty(alt, 'summe', {
get() { return this.positionen.reduce((a, b) => a + b, 0); },
enumerable: true,
configurable: true
});
console.log(warenkorb.summe);
console.log(alt.summe);
Eigenschafts-Deskriptor prüfen und Getter wieder auslesen
const sensor = { _rohwert: 512 };
sensor.__defineGetter__('prozent', function () {
return Math.round((this._rohwert / 1023) * 100);
});
console.log(sensor.prozent);
console.log(Object.getOwnPropertyDescriptor(sensor, 'prozent'));
console.log(sensor.__lookupGetter__('prozent') === Object.getOwnPropertyDescriptor(sensor, 'prozent').get);
// Wichtig · Fallstricke
- Veraltet: Die Methode ist nur aus Kompatibilitätsgründen spezifiziert (Annex B). Linter wie ESLint (
no-restricted-properties) und TypeScript-Typdefinitionen raten davon ab. Verwenden Sie stattdessenget-Syntax oderObject.defineProperty(). - Kein Setter: Ohne Setter wird eine Zuweisung an die Eigenschaft im nicht-strikten Modus stillschweigend ignoriert. Im Strict Mode wirft sie einen
TypeError. Einen Setter legen Sie mit__defineSetter__()oder im selben Deskriptor an. - Ein vorhandener Datenwert wird überschrieben: Existiert die Eigenschaft bereits als normale Dateneigenschaft, wird sie durch den Getter ersetzt. Ist sie nicht konfigurierbar (
configurable: false) oder ist das Objekt eingefroren, wird einTypeErrorgeworfen. - Arrow Functions: Übergeben Sie keine Arrow Function, wenn Sie
thisbrauchen. Eine Arrow Function hat kein eigenesthisund zeigt deshalb nicht auf das Objekt. - Objekte ohne Prototyp: Bei Objekten aus
Object.create(null)ist die Methode nicht verfügbar, weil sie aufObject.prototypeliegt. - Kompatibilität: Wird von allen gängigen Browsern und von Node.js unterstützt. Die Methode kann aber aus Sicherheitsgründen fehlen, zum Beispiel in gehärteten Umgebungen mit gesperrtem
Object.prototype.