Function: name

Baseline 已廣泛支援

此功能已相當成熟,可在多種裝置和瀏覽器版本上執行。自 ⁨2016 年 8 月⁩ 起,所有瀏覽器均已提供此功能。

Function 例項的 name 資料屬性指示函式建立時指定的函式名,或者對於匿名建立的函式,它可能是 anonymous''(空字串)。

試一試

const func1 = function () {};

const object = {
  func2: function () {},
};

console.log(func1.name);
// Expected output: "func1"

console.log(object.func2.name);
// Expected output: "func2"

字串。

Function: name 的屬性屬性
可寫
可列舉
可配置

注意: 在非標準、ES2015 之前的實現中,configurable 屬性也為 false

描述

函式的 name 屬性可用於在除錯工具或錯誤訊息中標識函式。它對語言本身沒有語義意義。

name 屬性是隻讀的,不能透過賦值運算子更改。

js
function someFunction() {}

someFunction.name = "otherFunction";
console.log(someFunction.name); // someFunction

要更改它,請使用 Object.defineProperty()

name 屬性通常根據函式的定義方式來推斷。在接下來的部分中,我們將描述推斷它的各種方式。

函式宣告

name 屬性返回函式宣告的名稱。

js
function doSomething() {}
doSomething.name; // "doSomething"

預設匯出的函式宣告

export default 宣告將函式作為宣告而不是表示式匯出。如果宣告是匿名的,則名稱為 "default"

js
// -- someModule.js --
export default function () {}

// -- main.js --
import someModule from "./someModule.js";

someModule.name; // "default"

函式建構函式

使用 Function() 建構函式建立的函式名稱為 "anonymous"。

js
new Function().name; // "anonymous"

函式表示式

如果函式表示式有名稱,則該名稱用作 name 屬性。

js
const someFunction = function someFunctionName() {};
someFunction.name; // "someFunctionName"

使用 function 關鍵字或箭頭函式語法建立的匿名函式表示式,預設名稱為 ""(空字串)。

js
(function () {}).name; // ""
(() => {}).name; // ""

然而,這種情況很少見 — 通常,為了在其他地方呼叫該函式,函式表示式會與一個識別符號關聯。匿名函式表示式的名稱可以在某些語法上下文中推斷出來,包括: 變數宣告、方法初始化程式和預設值

無法推斷名稱的一個實際場景是函式從另一個函式返回

js
function getFoo() {
  return () => {};
}
getFoo().name; // ""

變數宣告和方法

變數和方法可以從其語法位置推斷匿名函式的名稱。

js
const f = function () {};
const object = {
  someMethod: function () {},
};

console.log(f.name); // "f"
console.log(object.someMethod.name); // "someMethod"

賦值也同樣適用

js
let f;
f = () => {};
f.name; // "f"

初始化程式和預設值

解構預設引數類欄位 等的初始化程式(預設值)中的函式將繼承繫結識別符號的名稱作為它們的 name

js
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; // someMethod

簡寫方法

js
const o = {
  foo() {},
};
o.foo.name; // "foo";

繫結函式

Function.prototype.bind() 會生成一個函式,其名稱是 "bound " 加上函式名。

js
function foo() {}
foo.bind({}).name; // "bound foo"

Getter 和 setter

使用 getset 訪問器屬性時,函式名稱中會出現 "get" 或 "set"。

js
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";

類的名稱遵循與函式宣告和表示式相同的演算法。

js
class Foo {}
Foo.name; // "Foo"

警告: 只有當函式沒有名為 name 的自有屬性時,JavaScript 才會設定函式的 name 屬性。但是,類的 靜態成員 會被設定為類建構函式的自有屬性,從而阻止內建 name 的應用。請參見下面的 示例

Symbol 作為函式名

如果 Symbol 用作函式名且該 Symbol 有描述,則方法的名稱是方括號中的描述。

js
const sym1 = Symbol("foo");
const sym2 = Symbol();

const o = {
  [sym1]() {},
  [sym2]() {},
};

o[sym1].name; // "[foo]"
o[sym2].name; // "[]"

私有欄位和方法

私有欄位和私有方法將雜湊(#)作為其名稱的一部分。

js
class Foo {
  #field = () => {};
  #method() {}
  getNames() {
    console.log(this.#field.name);
    console.log(this.#method.name);
  }
}

new Foo().getNames();
// "#field"
// "#method"

示例

獲取物件的建構函式名

您可以使用 obj.constructor.name 來檢查物件的 "類"。

js
function Foo() {} // Or: class Foo {}

const fooInstance = new Foo();
console.log(fooInstance.constructor.name); // "Foo"

但是,由於靜態成員會成為類的自有屬性,因此我們無法獲取幾乎所有具有靜態方法屬性 name() 的類的類名。

js
class Foo {
  constructor() {}
  static name() {}
}

有了 static name() 方法後,Foo.name 不再持有實際的類名,而是指向 name() 函式物件。嘗試透過 fooInstance.constructor.name 獲取 fooInstance 的類,將根本無法得到類名,而是得到一個指向靜態類方法的引用。示例

js
const fooInstance = new Foo();
console.log(fooInstance.constructor.name); // ƒ name() {}

由於靜態欄位的存在,name 可能也不是一個函式。

js
class Foo {
  static name = 123;
}
console.log(new Foo().constructor.name); // 123

如果一個類有一個名為 name 的靜態屬性,它也會變得可寫。在沒有自定義靜態定義的情況下,內建定義是只讀的。

js
Foo.name = "Hello";
console.log(Foo.name); // "Hello" if class Foo has a static "name" property, but "Foo" if not.

因此,您不能依賴內建的 name 屬性來始終儲存類的名稱。

JavaScript 壓縮器和最小化器

警告: 使用 name 屬性進行原始碼轉換時要小心,例如 JavaScript 壓縮器(最小化器)或混淆器進行的轉換。這些工具通常作為 JavaScript 構建管道的一部分,在部署到生產環境之前減小程式的大小。此類轉換通常會在構建時更改函式的名稱。

原始碼,例如

js
function Foo() {}
const foo = new Foo();

if (foo.constructor.name === "Foo") {
  console.log("'foo' is an instance of 'Foo'");
} else {
  console.log("Oops!");
}

可能會被壓縮為

js
function a() {}
const b = new a();
if (b.constructor.name === "Foo") {
  console.log("'foo' is an instance of 'Foo'");
} else {
  console.log("Oops!");
}

在未壓縮的版本中,程式會進入真值分支並記錄 "'foo' is an instance of 'Foo'" — 而在壓縮版本中,它的行為不同,會進入 else 分支。如果您依賴 name 屬性,就像上面的示例一樣,請確保您的構建管道不會更改函式名稱,或者不要假設函式具有特定的名稱。

規範

規範
ECMAScript® 2026 語言規範
# sec-function-instances-name

瀏覽器相容性

另見