Dieser Inhalt wurde automatisch aus dem Englischen übersetzt, und kann Fehler enthalten.Erfahre mehr über dieses Experiment.
Funktion: name
Baseline Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since August 2016.
Diename Dateneigenschaft einerFunction Instanz gibt den Namen der Funktion an, wie er beim Erstellen angegeben wurde, oder sie kann entwederanonymous oder'' (ein leerer String) sein, wenn Funktionen anonym erstellt wurden.
In diesem Artikel
Probieren Sie es aus
const func1 = function () {};const object = { func2: function () {},};console.log(func1.name);// Expected output: "func1"console.log(object.func2.name);// Expected output: "func2"Wert
Ein String.
Eigenschaften vonFunktion: name | |
|---|---|
| Schreibbar | nein |
| Aufzählbar | nein |
| Konfigurierbar | ja |
Hinweis:In nicht-standardmäßigen, Pre-ES2015 Implementierungen war dasconfigurable Attribut ebenfallsfalse.
Beschreibung
Diename-Eigenschaft der Funktion kann verwendet werden, um die Funktion in Debugging-Werkzeugen oder Fehlermeldungen zu identifizieren. Sie hat keine semantische Bedeutung für die Sprache selbst.
Diename-Eigenschaft ist schreibgeschützt und kann nicht durch den Zuweisungsoperator geändert werden:
function someFunction() {}someFunction.name = "otherFunction";console.log(someFunction.name); // someFunctionUm sie zu ändern, verwenden SieObject.defineProperty().
Diename-Eigenschaft wird typischerweise basierend darauf abgeleitet, wie die Funktion definiert ist. In den folgenden Abschnitten beschreiben wir die verschiedenen Möglichkeiten, wie sie abgeleitet werden kann.
Funktionsdeklaration
Diename-Eigenschaft gibt den Namen einer Funktionsdeklaration zurück.
function doSomething() {}doSomething.name; // "doSomething"Standard-exporierte Funktionsdeklaration
Eineexport default Deklaration exportiert die Funktion als Deklaration anstelle eines Ausdrucks. Wenn die Deklaration anonym ist, ist der Name"default".
// -- someModule.js --export default function () {}// -- main.js --import someModule from "./someModule.js";someModule.name; // "default"Funktionskonstruktor
Funktionen, die mit demFunction() Konstruktor erstellt werden, haben den Namen "anonymous".
new Function().name; // "anonymous"Funktionsausdruck
Wenn der Funktionsausdruck benannt ist, wird dieser Name alsname-Eigenschaft verwendet.
const someFunction = function someFunctionName() {};someFunction.name; // "someFunctionName"Anonyme Funktionsausdrücke, die entweder mit demfunction-Schlüsselwort oder der Pfeilfunktionssyntax erstellt wurden, haben standardmäßig"" (einen leeren String) als Namen.
(function () {}).name; // ""(() => {}).name; // ""Solche Fälle sind jedoch selten — normalerweise wird, um die Funktion anderswo aufzurufen, der Funktionsausdruck mit einem Bezeichner verknüpft. Der Name eines anonymen Funktionsausdrucks kann innerhalb bestimmter syntaktischer Kontexte abgeleitet werden, einschließlich:Variablendeklaration, Methode,Initialisierung und Standardwert.
Ein praktischer Fall, in dem der Name nicht abgeleitet werden kann, ist eine Funktion, die aus einer anderen Funktion zurückgegeben wird:
function getFoo() { return () => {};}getFoo().name; // ""Variablendeklaration und Methode
Variablen und Methoden können den Namen einer anonymen Funktion aus ihrer syntaktischen Position ableiten.
const f = function () {};const object = { someMethod: function () {},};console.log(f.name); // "f"console.log(object.someMethod.name); // "someMethod"Dasselbe gilt für die Zuweisung:
let f;f = () => {};f.name; // "f"Initialisierung und Standardwert
Funktionen in Initialisierungen (Standardwerten) vonDestrukturierungen,Standardparametern,Klassenfeldern usw. erben den Namen des gebundenen Bezeichners als ihrenname.
const [f = () => {}] = [];f.name; // "f"const { someMethod: m = () => {} } = {};m.name; // "m"function foo(f = () => {}) { console.log(f.name);}foo(); // "f"class Foo { static someMethod = () => {};}Foo.someMethod.name; // someMethodVerkuerzte Methode
const o = { foo() {},};o.foo.name; // "foo";Gebundene Funktion
Function.prototype.bind() erzeugt eine Funktion, deren Name "bound " plus der Funktionsname ist.
function foo() {}foo.bind({}).name; // "bound foo"Getter und Setter
Wenn Zugriffseigenschaftenget undset verwendet werden, erscheint "get" oder "set" im Funktionsnamen.
const o = { get foo() { return 1; }, set foo(x) {},};const descriptor = Object.getOwnPropertyDescriptor(o, "foo");descriptor.get.name; // "get foo"descriptor.set.name; // "set foo";Klasse
Der Name einer Klasse folgt dem gleichen Algorithmus wie Funktionsdeklarationen und -ausdrücke.
class Foo {}Foo.name; // "Foo"Warnung:JavaScript setzt diename-Eigenschaft einer Funktion nur, wenn sie keine eigene Eigenschaft namensname hat. Klassen'statische Mitglieder werden jedoch als eigene Eigenschaften der Klassenkonstruktorfunktion festgelegt und verhindern somit, dass der eingebautename angewendet wird. Sieheein Beispiel unten.
Symbol als Funktionsname
Wenn einSymbol als Funktionsname verwendet wird und das Symbol eine Beschreibung hat, ist der Methodenname die Beschreibung in eckigen Klammern.
const sym1 = Symbol("foo");const sym2 = Symbol();const o = { [sym1]() {}, [sym2]() {},};o[sym1].name; // "[foo]"o[sym2].name; // "[]"Private Felder und Methoden
Private Felder und private Methoden haben das Rautezeichen (#) als Teil ihrer Namen.
class Foo { #field = () => {}; #method() {} getNames() { console.log(this.#field.name); console.log(this.#method.name); }}new Foo().getNames();// "#field"// "#method"Beispiele
>Den Namen des Konstruktors eines Objekts ermitteln
Sie könnenobj.constructor.name verwenden, um die "Klasse" eines Objekts zu überprüfen.
function Foo() {} // Or: class Foo {}const fooInstance = new Foo();console.log(fooInstance.constructor.name); // "Foo"Da jedoch statische Mitglieder zu eigenen Eigenschaften der Klasse werden, können wir den Klassenname für praktisch jede Klasse mit einer statischen Methodeneigenschaftname() nicht erhalten:
class Foo { constructor() {} static name() {}}Mit einerstatic name() Methode hältFoo.name nicht mehr den tatsächlichen Klassennamen, sondern eine Referenz auf dasname() Funktionsobjekt. Der Versuch, die Klasse vonfooInstance überfooInstance.constructor.name zu erhalten, gibt uns nicht den Klassennamen, sondern eine Referenz auf die statische Klassenmethode. Beispiel:
const fooInstance = new Foo();console.log(fooInstance.constructor.name); // ƒ name() {}Aufgrund der Existenz statischer Felder könntename ebenfalls keine Funktion sein.
class Foo { static name = 123;}console.log(new Foo().constructor.name); // 123Wenn eine Klasse eine statische Eigenschaft namensname hat, wird sie auchbeschreibbar. Die eingebaute Definition in der Abwesenheit einer benutzerdefinierten statischen Definition istschreibgeschützt:
Foo.name = "Hello";console.log(Foo.name); // "Hello" if class Foo has a static "name" property, but "Foo" if not.Daher können Sie sich nicht darauf verlassen, dass die eingebautename-Eigenschaft immer den Namen einer Klasse enthält.
JavaScript-Komprimierer und -Minifier
Warnung:Seien Sie vorsichtig bei der Verwendung dername-Eigenschaft mit Quellcode-Transformationen, wie sie von JavaScript-Komprimierern (Minifizierern) oder Obfuskatoren durchgeführt werden. Diese Werkzeuge werden oft im Rahmen einer JavaScript-Build-Pipeline verwendet, um die Größe eines Programms vor der Bereitstellung in der Produktion zu reduzieren. Solche Transformationen ändern oft den Namen einer Funktion zur Build-Zeit.
Quellcode wie:
function Foo() {}const foo = new Foo();if (foo.constructor.name === "Foo") { console.log("'foo' is an instance of 'Foo'");} else { console.log("Oops!");}kann komprimiert werden zu:
function a() {}const b = new a();if (b.constructor.name === "Foo") { console.log("'foo' is an instance of 'Foo'");} else { console.log("Oops!");}In der unkomprimierten Version läuft das Programm in den truthy-Zweig und protokolliert "'foo' is an instance of 'Foo'" — während es in der komprimierten Version anders reagiert und in den else-Zweig läuft. Wenn Sie sich auf diename-Eigenschaft verlassen, wie im obigen Beispiel, stellen Sie sicher, dass Ihre Build-Pipeline die Funktionsnamen nicht ändert, oder verlassen Sie sich nicht darauf, dass eine Funktion einen bestimmten Namen hat.
Spezifikationen
| Specification |
|---|
| ECMAScript® 2026 Language Specification> # sec-function-instances-name> |