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

Object.prototype.__lookupSetter__()

Methode

Gibt die Setter-Funktion zurück, die an die Eigenschaft <code>prop</code> gebunden ist. Dabei wird auch die Prototypenkette durchsucht. Gibt es keinen Setter, ist das Ergebnis <code>undefined</code>.

seit JavaScript ES2017 (Annex B, standardisiert); in allen Browser deprecated seit ja Kategorie: method-property

Signatur

Object.prototype.__lookupSetter__(prop)

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

Typ
Function | undefined
Beschreibung
Die Setter-Funktion der Eigenschaft oder 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'));
function set name undefined

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'));
100 undefined

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'));
true

// 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 get hat, ergibt ebenfalls undefined.
  • Objekte ohne Prototyp: Objekte aus Object.create(null) erben nicht von Object.prototype und haben diese Methode deshalb nicht. Ein direkter Aufruf wirft einen TypeError.
  • Proxies: Bei einem Proxy werden die Traps getOwnPropertyDescriptor und getPrototypeOf ausgelö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.