Signatur
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
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'));
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));
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'));
// 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 hilftObject.prototype.__lookupGetter__.call(obj, 'x'). - Ist
thisnulloderundefined, wird einTypeErrorgeworfen. - Der Getter wird nicht ausgeführt, sondern nur zurückgegeben. Beim Aufruf muss
thisselbst percall()gesetzt werden. - Browser-Unterstützung: in allen modernen Browsern, Node.js und Deno vorhanden.