Start · Sprachen · JavaScript · Referenz · Function: name

Function: name

Eigenschaft

Die schreibgeschützte Eigenschaft <code>name</code> einer Funktion enthält ihren Namen, wie er beim Erstellen angegeben oder aus dem Kontext abgeleitet wurde.

seit JavaScript ES2015 (standardisiert; vorher nicht-standardisier Kategorie: method-property

Signatur

Function.prototype.name

Beschreibung

Jede Funktion hat eine eigene Dateneigenschaft name. Sie enthält den Bezeichner aus der Funktionsdeklaration oder dem Funktionsausdruck. Hat eine Funktion keinen expliziten Namen, leitet die Engine ihn seit ES2015 aus dem Kontext ab, zum Beispiel aus der Variablen, der Objekt-Eigenschaft oder dem Klassenfeld, dem die Funktion zugewiesen wird. Lässt sich kein Name ableiten, ist der Wert ein leerer String ''. Funktionen, die mit new Function() erzeugt werden, heißen "anonymous".

Bei bestimmten Funktionsarten bekommt der Name ein Präfix: Getter und Setter heißen "get x" bzw. "set x", gebundene Funktionen aus bind() heißen "bound fn". Methoden mit Symbol-Schlüssel bekommen die Symbolbeschreibung in eckigen Klammern, etwa "[meinSymbol]". Bei Klassen liefert name den Klassennamen.

Die Eigenschaft ist nützlich für Logging, Debugging, Stacktraces, Fehlermeldungen und einfache Registrierungsmechanismen (z. B. Plugin-Namen). Für Programmlogik solltest du dich aber nicht darauf verlassen, denn Minifier ändern oder kürzen Namen.

Die Eigenschaft ist nicht beschreibbar (writable: false), nicht aufzählbar, aber konfigurierbar. Du kannst sie also nicht per Zuweisung ändern, wohl aber mit Object.defineProperty().

Rückgabewert

Typ
string
Beschreibung
Der Name der Funktion. Das ist entweder der explizite oder der abgeleitete Bezeichner, eventuell mit Präfix ("get ", "set ", "bound "), "anonymous" bei new Function() oder '', wenn kein Name vorhanden ist.

Beispiele

Explizite und abgeleitete Namen

function berechneSumme(a, b) { return a + b; }
const multipliziere = (a, b) => a * b;
const dividiere = function teile(a, b) { return a / b; };
const werkzeuge = { runden() {}, kappen: () => {} };

console.log(berechneSumme.name);
console.log(multipliziere.name);
console.log(dividiere.name);   // expliziter Name hat Vorrang
console.log(werkzeuge.runden.name, werkzeuge.kappen.name);
console.log((() => {}).name === '');
console.log(new Function('return 1').name);
berechneSumme multipliziere teile runden kappen true anonymous

Präfixe bei Gettern, gebundenen Funktionen, Symbolen und Klassen

class Konto {
  #saldo = 0;
  get saldo() { return this.#saldo; }
  [Symbol.iterator]() {}
  static erstellen() { return new Konto(); }
}

const getter = Object.getOwnPropertyDescriptor(Konto.prototype, 'saldo').get;
console.log(getter.name);
console.log(Konto.prototype[Symbol.iterator].name);
console.log(Konto.name, Konto.erstellen.name);

const gebunden = Konto.erstellen.bind(null);
console.log(gebunden.name);
get saldo [Symbol.iterator] Konto erstellen bound erstellen

Logging-Wrapper mit Funktionsnamen und Umbenennen per defineProperty

const mitLogging = (fn) => {
  const wrapper = (...args) => {
    console.log(`Aufruf: ${fn.name}(${args.join(', ')})`);
    return fn(...args);
  };
  // Zuweisung wirkungslos (writable: false) – defineProperty funktioniert
  Object.defineProperty(wrapper, 'name', { value: `logged_${fn.name}` });
  return wrapper;
};

const quadrat = (x) => x * x;
const geloggt = mitLogging(quadrat);
console.log(geloggt(4));
console.log(geloggt.name);
Aufruf: quadrat(4) 16 logged_quadrat

// Wichtig · Fallstricke

  • Minifizierung: Werkzeuge wie Terser oder esbuild benennen Funktionen und Klassen um. Logik wie if (obj.constructor.name === 'Benutzer') kann deshalb im Produktions-Build scheitern. Nutze stattdessen instanceof oder eigene Kennungen bzw. Optionen wie keep_fnames.
  • Nicht beschreibbar: fn.name = 'x' wird im Sloppy-Modus stillschweigend ignoriert und wirft im Strict Mode einen TypeError. Zum Ändern brauchst du Object.defineProperty().
  • Namensableitung: Der Name wird nur bei direkter Zuweisung abgeleitet (Variable, Eigenschaft, Standardparameter, Destrukturierungs-Standardwert). Bei obj['a' + 'b'] = () => {} oder beim Übergeben als Argument (arr.map(() => {})) bleibt der Name leer.
  • Statisches name in Klassen: Definiert eine Klasse selbst static name() oder ein statisches Feld name, verdeckt das die eingebaute Eigenschaft.
  • Kompatibilität: Die Namensableitung gibt es seit ES2015 und sie wird von allen modernen Browsern und Node.js unterstützt. Der Internet Explorer unterstützt name nicht.