JavaScript свойство Function.name
Определение и применение
JavaScript свойство name объекта Function соответствует имени функции, указанному при ее
создании, либо выведенному из имени переменной или свойства. Без такого имени результат может быть пустой строкой. Имя
anonymous получают функции, созданные конструктором Function. Свойство
name доступно только для чтения.
Присваивание не меняет стандартное свойство name, но его можно переопределить через
Object.defineProperty(), поскольку configurable (разрешение переопределения) равно
true. Имя служит для диагностики и не гарантирует уникальность.
Создание функции из строки показано статическим листингом: учебный редактор запрещает динамическую компиляцию кода.
new Function('return 1').name; // "anonymous"
Атрибуты свойства: writable разрешает присваивание, enumerable определяет участие в
перечислении свойств, configurable разрешает удаление и переопределение.
| Атрибут | Значение |
|---|---|
writable |
false |
enumerable |
false |
configurable |
true* |
* - в нестандартных реализациях (до ECMAScript 2015) атрибут configurable имел значение
false.
Подробную информацию о дескрипторах свойств вы можете получить в описании метода
defineProperty(), который позволяет определить новое или изменить существующее свойство объекта, описывая его дескрипторами.
Поддержка браузерами
Спецификация: ecma262
Поддерживается во всех основных браузерах с 2016 года.
| Возможность | Компьютеры | Мобильные | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
name | 15 | 14 | 1 | 10.5 | 6 | 18 | 4 | 11 | 6 | 1.0 | 4.4 | 6 |
| Configurable: true | 43 | 14 | 38 | 30 | 10 | 43 | 38 | 30 | 10 | 4.0 | 43 | 10 |
| Inferred names on anonymous functions | 51 | 79 Версия 79 выпущена в 2020 г. Версия 14 выпущена в 2016 г. — Удалено в 79; Частичная поддержка Примечание MDN (англ.) Names for functions defined in a dictionary are properly assigned; however, anonymous functions defined on a var/let variable assignment have blank names. | 53 | 38 | 10 | 51 | 53 | 41 | 10 | 5.0 | 51 | 10 |
поддерживаетсяс ограниченияминет поддержкинет данных≤31 — не позднее версии 31
JavaScript синтаксис:
func.name
Спецификация
Примеры, попробуйте сами
Откуда функция получает имя
Переименуйте переменную и именованную функцию. Сравните явно заданное, выведенное и пустое имя.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
const named = function myFunc() {}
const object = { method() {} }
console.log(named.name) // myFunc
console.log(object.method.name) // method
// Имя выводится из переменной; несвязанное выражение остаётся без имени.
const inferred = () => {}
console.log(inferred.name) // inferred
console.log(function () {}.name === '') // true
Функции на которых вызывается метод
bind()
возвращают значение имени функции "bound " + имя функции :
Почему bind() добавляет bound к имени
Измените имя исходной функции и посмотрите на имя функции после bind().
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
const original = function myFunc() {}
console.log(original.bind(null).name) // bound myFunc
При использовании свойств метода доступа get и set у объекта при получении имен этих функций
через объект дескриптор (с использованием метода
getOwnPropertyDescriptor()) к имени этих функций будет добавлено значение "get" или "set":
Как называются геттеры и сеттеры
Переименуйте свойство value в объекте и в запросе дескриптора. Сравните имена get и set.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
const object = {
get value() {
return 1
},
set value(next) {},
}
const descriptor = Object.getOwnPropertyDescriptor(object, 'value')
console.log(descriptor.get.name) // get value
console.log(descriptor.set.name) // set value
Если символ используется в качестве имени функции и имеет описание, которые было задано при создании, то имя функции будет соответствовать этому описанию, помещенному в квадратные скобки, иначе будет возвращена пустая строка:
Как символьный ключ определяет имя метода
Измените описание Symbol и сравните имя метода с ключом без описания.
index.html
<p>Результат выполнения выводится в консоль.</p>
main.js
const first = Symbol('first')
const empty = Symbol()
const object = { [first]() {}, [empty]() {} }
console.log(object[first].name) // [first]
console.log(object[empty].name) // Пустая строка.