--- title: Function.name slug: Web/JavaScript/Reference/Global_Objects/Function/name tags: - ECMAScript 2015 - Function - JavaScript - Властивість translation_of: Web/JavaScript/Reference/Global_Objects/Function/name ---
Властивість тільки для читання об'єкта {{jsxref("Function")}} name відображає ім'я функції, яке було вказане при створенні, або "anonymous" для анонімних функцій.
{{EmbedInteractiveExample("pages/js/function-name.html")}}
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
{{js_property_attributes(0,0,1)}}
Зауважте, що у нестандартних реалізаціях до ES2015 атрибут configurable (доступний для налаштування) також мав значення false.
Властивість name повертає ім'я функції.
function doSomething() {}
console.log(doSomething.name); // "doSomething"
Функції, створені за допомогою new Function(...) або просто Function(...) створюють об'єкти {{jsxref("Function")}}, а їхнє ім'я "anonymous".
(new Function).name; // "anonymous"
Змінні та методи можуть вивести ім'я анонімної функції з її синтаксичної позиції (нове у ECMAScript 2015).
var f = function() {};
var object = {
someMethod: function() {}
};
console.log(f.name); // "f"
console.log(object.someMethod.name); // "someMethod"
Ви можете оголосити функцію з ім'ям у {{jsxref("Operators/Function", "функціональному виразі", "", 1)}}:
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
Ви не можете змінювати ім'я функції, ця властивість доступна лише для читання:
Наведений нижче приклад суперечить тому, що сказано на початку цього розділу і не працює як описано.
var object = {
// anonymous
someMethod: function() {}
};
object.someMethod.name = 'otherMethod';
console.log(object.someMethod.name); // someMethod
Однак, щоб змінити її, ви можете скористатись {{jsxref("Object.defineProperty()")}}.
var o = {
foo(){}
};
o.foo.name; // "foo";
Метод {{jsxref("Function.bind()")}} створює функцію, чиїм ім'ям буде "bound" плюс ім'я функції.
function foo() {};
foo.bind({}).name; // "bound foo"
При використанні властивостей-аксесорів 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, щоб перевірити "клас" об'єкта (але обов'язково прочитайте застереження нижче):
function Foo() {} // Синтаксис ES2015: class Foo {}
var fooInstance = new Foo();
console.log(fooInstance.constructor.name); // виводить "Foo"
Застереження: Інтерпретатор коду встановить значення вбудованої властивості Function.name тільки якщо функція не має своєї властивості з назвою name (дивіться розділ 9.2.11 ECMAScript2015 Language Specification). Однак, ES2015 визначає ключове слово static таким чином, що статичні методі встановлюються як OwnProperty функції-конструктора класу (ECMAScript2015, 14.5.14.21.b+ 12.2.6.9).
І тому ми не можемо отримати ім'я класу фактично для жодного класу, що має статичний метод name():
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 поверне нам зовсім не ім'я класу, а посилання на статичний метод класу. Приклад:
let fooInstance = new Foo(); console.log(fooInstance.constructor.name); // виводить function name()
Ви могли також побачити у прикладі з синтаксисом ES5, що у Chrome чи Firefox наше статичне оголошення Foo.name стає доступним для запису. Вбудоване оголошення за відсутності користувацького статичного методу є доступним лише для читання:
Foo.name = 'Привіт'; console.log(Foo.name); // виведе "Привіт", якщо клас має статичну властивість name(), інакше виведе "Foo".
Таким чином, не можна розраховувати, що вбудована властивість Function.name завжди міститиме ім'я класу.
Якщо {{jsxref("Symbol")}} використовується в якості імені функції і має опис, ім'ям метода буде опис у квадратних дужках.
let sym1 = Symbol("foo");
let sym2 = Symbol();
let o = {
[sym1]: function(){},
[sym2]: function(){}
};
o[sym1].name; // "[foo]"
o[sym2].name; // ""
Застереження: Будьте обережні, використовуючи Function.name та перетворення коду, які здійснюють компресори (мініфікатори) або обфускатори JavaScript. Ці інструменти часто використовуються як частина конвеєра збірки JavaScript, щоб зменшити розмір програми перед розгортанням у виробничому середовищі. Такі перетворення часто змінюють ім'я функції під час збірки.
Подібний першокод:
function Foo() {};
let foo = new Foo();
if (foo.constructor.name === 'Foo') {
console.log("'foo' є екземпляром 'Foo'");
} else {
console.log('Ой-ой!');
}
може бути стиснутий до:
function a() {};
let b = new a();
if (b.constructor.name === 'Foo') {
console.log("'foo' є екземпляром 'Foo'");
} else {
console.log('Ой-ой!');
}
У нестиснутій версії, програма виконує правдиву гілку і виводить "'foo' є екземпляром 'Foo'". В той час, як у стиснутій версії вона поводиться по-іншому і виконує гілку else. Якщо ви покладаєтесь на Function.name, як у наведеному вище прикладі, переконайтесь, що ваш конвеєр збірки не змінює імена функцій, або не припускайте, що функція матиме певне ім'я.
| Специфікація | Статус | Коментар |
|---|---|---|
| {{SpecName('ES6', '#sec-name', 'name')}} | {{Spec2('ES6')}} | Початкове визначення. |
| {{SpecName('ESDraft', '#sec-name', 'name')}} | {{Spec2('ESDraft')}} |
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
{{Compat("javascript.builtins.Function.name")}}