Signatur
Beschreibung
Mit __lookupSetter__() fragst du ab, welche Funktion als Setter (set) für eine bestimmte Eigenschaft eines Objekts hinterlegt ist. Die Methode sucht zuerst direkt auf dem Objekt und geht dann die Prototypenkette nach oben durch. Das erste Objekt, das die Eigenschaft als eigene Eigenschaft besitzt, entscheidet: Handelt es sich um eine Accessor-Eigenschaft, kommt deren set-Funktion zurück (ggf. undefined, wenn nur ein Getter definiert ist). Handelt es sich um eine Dateneigenschaft, ist das Ergebnis undefined.
Die Methode stammt aus der Zeit vor ES5 und ist nur aus Kompatibilitätsgründen im Anhang B der Spezifikation standardisiert. In modernem Code verwendest du stattdessen Object.getOwnPropertyDescriptor() zusammen mit Object.getPrototypeOf(). Damit prüfst du den Deskriptor gezielt und bekommst zusätzlich Angaben wie enumerable und configurable.
Nützlich ist __lookupSetter__() vor allem, wenn du älteren Code liest oder pflegst, der sie zusammen mit __defineSetter__() verwendet. Neue Projekte sollten sie nicht mehr einsetzen.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $prop Pflicht | string | symbol | Name der Eigenschaft, deren Setter gesucht wird. Werte, die weder String noch Symbol sind, werden per ToPropertyKey in einen String umgewandelt. |
Rückgabewert
undefined, wenn es die Eigenschaft nicht gibt, sie eine Dateneigenschaft ist oder keinen Setter hat.Beispiele
Setter eines Objektliterals abfragen
const benutzer = {
_name: '',
set name(wert) {
this._name = wert.trim();
},
get name() {
return this._name;
}
};
const setter = benutzer.__lookupSetter__('name');
console.log(typeof setter);
console.log(setter.name);
console.log(benutzer.__lookupSetter__('_name'));
Setter aus der Prototypenkette finden (Klassen)
class Temperatur {
#celsius = 0;
set fahrenheit(f) {
this.#celsius = (f - 32) * 5 / 9;
}
get celsius() {
return this.#celsius;
}
}
const t = new Temperatur();
// Der Setter liegt auf Temperatur.prototype, nicht auf t
const setter = t.__lookupSetter__('fahrenheit');
setter.call(t, 212);
console.log(t.celsius);
console.log(t.__lookupSetter__('celsius'));
Moderne Alternative mit Object.getOwnPropertyDescriptor
const findeSetter = (obj, prop) => {
let aktuell = obj;
while (aktuell !== null) {
const desc = Object.getOwnPropertyDescriptor(aktuell, prop);
if (desc) return desc.set; // bei Dateneigenschaft: undefined
aktuell = Object.getPrototypeOf(aktuell);
}
return undefined;
};
const config = {
set modus(m) { console.log(`Modus: ${m}`); }
};
const abgeleitet = Object.create(config);
console.log(findeSetter(abgeleitet, 'modus') === abgeleitet.__lookupSetter__('modus'));
// Wichtig · Fallstricke
- Veraltet: Die Methode ist nur als Altlast in Anhang B der Spezifikation beschrieben. Nutze in neuem Code
Object.getOwnPropertyDescriptor(). - Überdeckung: Hat das Objekt selbst eine gleichnamige Dateneigenschaft, liefert die Methode
undefined, auch wenn weiter oben in der Prototypenkette ein Setter existiert. Die Suche endet bei der ersten eigenen Eigenschaft. - Nur Getter: Eine Accessor-Eigenschaft, die nur einen
gethat, ergibt ebenfallsundefined. - Objekte ohne Prototyp: Objekte aus
Object.create(null)erben nicht vonObject.prototypeund haben diese Methode deshalb nicht. Ein direkter Aufruf wirft einenTypeError. - Proxies: Bei einem Proxy werden die Traps
getOwnPropertyDescriptorundgetPrototypeOfausgelöst. - Kompatibilität: Wird von allen gängigen Browsern und von Node.js unterstützt. Laufzeitumgebungen ohne Anhang B, etwa manche eingebetteten Engines, können die Methode weglassen.