Signatur
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
"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);
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);
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);
// 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 stattdesseninstanceofoder eigene Kennungen bzw. Optionen wiekeep_fnames. - Nicht beschreibbar:
fn.name = 'x'wird im Sloppy-Modus stillschweigend ignoriert und wirft im Strict Mode einenTypeError. Zum Ändern brauchst duObject.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
namein Klassen: Definiert eine Klasse selbststatic name()oder ein statisches Feldname, 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
namenicht.