Start · Sprachen · JavaScript · Referenz · Object.prototype.__defineGetter__()

Object.prototype.__defineGetter__()

Methode

Bindet eine Eigenschaft eines Objekts an eine Getter-Funktion, die bei jedem Lesezugriff auf diese Eigenschaft aufgerufen wird (veraltet).

seit JavaScript ES2017 (Annex B, standardisiert), veraltet – in al deprecated seit ja Kategorie: method-property

Signatur

Object.prototype.__defineGetter__(prop, func)

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

Typ
undefined
Beschreibung
Kein 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);
Anna Schmidt Lena Schmidt

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);
37.49 6

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);
50 { get: [Function (anonymous)], set: undefined, enumerable: true, configurable: true } true

// 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 stattdessen get-Syntax oder Object.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 ein TypeError geworfen.
  • Arrow Functions: Übergeben Sie keine Arrow Function, wenn Sie this brauchen. Eine Arrow Function hat kein eigenes this und zeigt deshalb nicht auf das Objekt.
  • Objekte ohne Prototyp: Bei Objekten aus Object.create(null) ist die Methode nicht verfügbar, weil sie auf Object.prototype liegt.
  • 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.