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

Object.prototype.__lookupGetter__()

Methode

Gibt die Getter-Funktion zurück, die an die Eigenschaft <code>prop</code> des Objekts oder seiner Prototypkette gebunden ist, sonst <code>undefined</code>.

seit JavaScript ES2015 (Annex B, normiert); Baseline: alle Browser deprecated seit ja Kategorie: method-property

Signatur

Object.prototype.__lookupGetter__(prop)

Beschreibung

__lookupGetter__() sucht die Eigenschaft prop zuerst im Objekt selbst und dann entlang der Prototypkette. Ist sie dort eine Accessor-Eigenschaft mit Getter, wird genau diese Getter-Funktion zurückgegeben. Handelt es sich um eine Dateneigenschaft oder fehlt die Eigenschaft ganz, ist der Rückgabewert undefined.

Die Methode stammt aus alten Mozilla-Erweiterungen und ist nur aus Kompatibilitätsgründen in Anhang B der ECMAScript-Spezifikation aufgenommen worden. Sie gilt als veraltet. Der moderne, standardkonforme Weg ist Object.getOwnPropertyDescriptor() kombiniert mit Object.getPrototypeOf(), wenn man die Prototypkette selbst durchlaufen will.

Nützlich ist sie heute höchstens in Legacy-Code oder beim schnellen Debuggen, um herauszufinden, welche Funktion beim Lesen einer Eigenschaft tatsächlich ausgeführt wird, auch bei geerbten Accessoren wie Map.prototype.size.

Parameter

Name Typ Default Beschreibung
$prop Pflicht string | symbol Name der Eigenschaft, deren Getter gesucht wird. Andere Werte werden in einen Eigenschaftsschlüssel (String) umgewandelt.

Rückgabewert

Typ
Function | undefined
Beschreibung
Die an prop gebundene Getter-Funktion (eigene oder geerbte) bzw. undefined, wenn keine Accessor-Eigenschaft mit Getter existiert.

Beispiele

Getter eines Objektliterals ermitteln

const konto = {
  _saldo: 250,
  get saldo() {
    return `${this._saldo} €`;
  }
};

const getter = konto.__lookupGetter__('saldo');
console.log(typeof getter);
console.log(getter.call(konto));
console.log(konto.__lookupGetter__('_saldo'));
function 250 € undefined

Geerbten Getter aus der Prototypkette finden

const m = new Map([['a', 1], ['b', 2]]);

// size ist ein Getter auf Map.prototype, nicht auf der Instanz
const sizeGetter = m.__lookupGetter__('size');
console.log(sizeGetter === Object.getOwnPropertyDescriptor(Map.prototype, 'size').get);
console.log(sizeGetter.call(m));
true 2

Moderner Ersatz ohne __lookupGetter__

const lookupGetter = (obj, prop) => {
  for (let o = obj; o !== null; o = Object.getPrototypeOf(o)) {
    const desc = Object.getOwnPropertyDescriptor(o, prop);
    if (desc) return desc.get; // Dateneigenschaft => undefined
  }
  return undefined;
};

class Person {
  constructor(vorname, nachname) {
    this.vorname = vorname;
    this.nachname = nachname;
  }
  get vollerName() {
    return `${this.vorname} ${this.nachname}`;
  }
}

const p = new Person('Ada', 'Lovelace');
console.log(lookupGetter(p, 'vollerName').call(p));
console.log(lookupGetter(p, 'vorname'));
Ada Lovelace undefined

// Wichtig · Fallstricke

  • Veraltet: Die Methode steht nur in Anhang B der Spezifikation. Für neuen Code Object.getOwnPropertyDescriptor() verwenden.
  • Die Suche bricht bei der ersten gefundenen Eigenschaft ab: Überdeckt eine eigene Dateneigenschaft einen geerbten Getter, liefert die Methode undefined.
  • Objekte ohne Prototyp (Object.create(null)) besitzen die Methode nicht. Hier hilft Object.prototype.__lookupGetter__.call(obj, 'x').
  • Ist this null oder undefined, wird ein TypeError geworfen.
  • Der Getter wird nicht ausgeführt, sondern nur zurückgegeben. Beim Aufruf muss this selbst per call() gesetzt werden.
  • Browser-Unterstützung: in allen modernen Browsern, Node.js und Deno vorhanden.