Movatterモバイル変換


[0]ホーム

URL:


  1. Веб-технологии для разработчиков
  2. JavaScript
  3. Справочник по JavaScript
  4. Стандартные встроенные объекты
  5. Function
  6. Function.name

This page was translated from English by the community.Learn more and join the MDN Web Docs community.

View in EnglishAlways switch to English

Function.name

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨август 2016 г.⁩.

Read-only свойствоname глобального объектаFunction и егоэкземпляров содержит название функции созданное во время определения функции или присваивания ссылки на функцию переменной, свойству, аргументу и т. п. Для анонимных функций это свойство может иметь значение"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
Записываемоенет
Перечисляемоенет
Настраиваемоеда

Примечание:Заметьте, что в нестандартном, pre-ES2015 релизеconfigurable свойство былоfalse

Примеры

Имя объявленной функции

Свойствоname возвращает имя функции, либо пустую строку для анонимных функций:

js
function doSomething() {}alert(doSomething.name); // выведет "doSomething"

Имя функции-конструктора

Функции, созданные синтаксисомnew Function(...) или простоFunction(...) создаютFunction и имеют name "anonymous":

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

Предполагаемые имена функций

Переменные и методы могут предположить название анонимной функции из её синтаксической позиции (new in ECMAScript 2015).

js
var f = function () {};var object = {  someMethod: function () {},};console.log(f.name); // "f"console.log(object.someMethod.name); // "someMethod"

Вы можете определить функцию с именем вfunction expression:

js
var object = {  someMethod: function object_someMethod() {},};console.log(object.someMethod.name); // выведет "object_someMethod"try {  object_someMethod;} catch (e) {  console.log(e);}// ReferenceError: object_someMethod is not defined

Вы не можете изменить имя функции, это свойство только для чтения:

js
var object = {  // анонимная функция  someMethod: function () {},};object.someMethod.name = "otherMethod";alert(object.someMethod.name); //someMethod

Для изменения name можно использоватьObject.defineProperty().

Сокращённые имена методов

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

Имена функций после привязки

Function.bind() производит функцию, получающую имя "bound и название самой функции.

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

Имена функций для getters и setters

Когда используютсяget иset, "get" и "set" появятся в имени функции.

let o = {  get foo(){},  set foo(x){}};var descriptor = Object.getOwnPropertyDescriptor(o, "foo");descriptor.get.name; // "get foo"descriptor.set.name; // "set foo";

Имена функций-классов

Можно использоватьobj.constructor.name чтобы проверить "class" объекта (читайте предупреждение ниже):

function Foo() {}  // ES2015 Syntax: class Foo {}var fooInstance = new Foo();console.log(fooInstance.constructor.name); // logs "Foo"

Предупреждение:Интерпретатор объявит встроенноеFunction.name свойство только если функция не имеет своего собственного свойстваname (см.9.2.11 of the ECMAScript2015 Language Specification). Однако, в ES2015 статичные методы перезаписывают OwnProperty конструкторов класса-функции (ECMAScript2015,14.5.14.21.b +12.2.6.9).

Таким образом, нельзя получить доступ кname любого класса со статичным свойствомname():

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

Соstatic name() методомFoo.name больше не содержит название класса, но отсылает к функцииname(). Приведённое выше определение класса в ES2015 будет вести себя в Chrome и Firefox как в ES5:

function Foo() {}Object.defineProperty(Foo, 'name', { writable: true });Foo.name = function() {};

Пытаясь получить доступ кfooInstance с помощьюfooInstance.constructor.name не даст название класса, но выведет методname(). Пример:

let fooInstance = new Foo();console.log(fooInstance.constructor.name); // logs function name()

Из ES5 syntax примера также видно, что в Chrome или Firefox статичное определениеFoo.name становитсязаписываемым (writable). Встроенное определение в отсутствии кастомного статичного методадоступно только для чтения:

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

Следовательно не ожидайте, чтоFunction.name свойство будет всегда содержать имя класса.

Имена функций-символов

Если уSymbol объявляется имя, то название метода - это имя квадратных скобках.

js
let sym1 = Symbol("foo");let sym2 = Symbol();let o = {  [sym1]: function () {},  [sym2]: function () {},};o[sym1].name; // "[foo]"o[sym2].name; // ""

JavaScript минифицированный

Предупреждение:Будьте осторожны, используяFunction.name и изменения source кода с помощью JavaScript compressors (minifiers) или обфускаторов. Эти инструменты часто используются, как встроенные в JavaScript build pipeline, чтобы сократить размер билда перед деплоем в production. Такие трансформации часто изменяют имена функций.

Такой source code:

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

может быть сжат в:

function a() {};let 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'". В то время, как в сжатой версии он ведёт себя иначе. Если вы полагаетесь наFunction.name, как в примере, то убедитесь, что pipeline не меняет код или не ожидайте от функции определённого имени.

Спецификации

Specification
ECMAScript® 2026 Language Specification
# sec-function-instances-name

Совместимость с браузерами

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp