La propriété function.name
renvoie le nom de la fonction.
Attributs de Function.name |
|
---|---|
Écrivable | Non |
Énumérable | Non |
Configurable | Oui |
Note : Pour les implémentations non-standards avant ES6, l'attribut configurable
valait false
également.
Description
La propriété name
renvoie le nom d'une fonction ou bien (pour les implémentations pré-ES6/2015) la chaîne vide dans le cas des fonctions anonymes :
function faireQqc() { } console.log(faireQqc.name); // affiche "faireQqc"
Les fonctions créées avec la syntaxe new
Function(...)
ou Function(...)
voient leurs noms initialisés avec la chaîne de caractères vide. Dans les exemples suivants, on utilise des fonctions anonymes pour lesquelles name
renvoie la chaîne vide :
var f = function() { }; var objet = { uneMéthode: function() {} }; console.log(f.name == ""); // true console.log(objet.uneMéthode.name == ""); // true
Les moteurs implémentant les fonctions selon ES6 peuvent inférer le nom de la fonction anonyme grâce à sa position syntaxique. Ainsi :
var f = function() {}; console.log(f.name); // 'f' avec ES6
On peut définir une fonction nommée avec une expression de fonction :
var objet = { uneMéthode: function objet_uneMéthode() {} }; console.log(objet.uneMéthode.name); // affiche "objet_uneMéthode" try { objet_uneMéthode} catch(e) { console.log(e); } // ReferenceError: objet_uneMéthode n'est pas défini
Cette propriété n'est accessible qu'en lecture, on ne peut pas la changer :
var objet = { // anonyme uneMéthode: function() { } }; objet.uneMéthode.name = "uneMéthode"; console.log(objet.uneMéthode.name); // chaîne vide, uneMéthode est anonyme
Pour la modifier de façon explicite, on peut en revanche utiliser Object.defineProperty()
.
Exemples
On peut utiliser obj.constructor.name
pour consulter le prototype d'un objet :
function a() { } var b = new a(); console.log(b.constructor.name); // Affichera "a"
Attention : Si on utilise une propriété propre qui s'appelle déjà name
, l'interpréteur n'affectera pas cette propriété (la propriété personnalisée surchargera la propriété normale) (cf. la spécification).
Attention : Lorsqu'on utilise un minificateur/compresseur de code, cela peut impacter les noms des fonctions et, dès lors, utiliser Function.name
sera source d'erreur car le nom attendu ne sera plus celui utilisé par le script (ex. la fonction toto
pourra être renommée t
afin d'économiser du code et t.name
ne renverra pas toto
mais t
.
Spécifications
Spécification | État | Commentaires |
---|---|---|
ECMAScript 2015 (6th Edition, ECMA-262) La définition de 'name' dans cette spécification. |
Standard | Définition initiale. |
ECMAScript 2017 Draft (ECMA-262) La définition de 'name' dans cette spécification. |
Projet |
Compatibilité des navigateurs
Fonctionnalité | Chrome | Firefox (Gecko) | Internet Explorer/Edge | Opera | Safari |
---|---|---|---|---|---|
Support simple | 33 | (Oui) | 12 | (Oui) | (Oui) |
Configurable : true | 43 | 38 (38) | ? | ? | ? |
Inférence des noms pour les fonctions anonymes | 51.0 | Pas de support [1] | ? | ? | ? |
Fonctionnalité | Android | Webview Android | Firefox Mobile (Gecko) | IE Mobile/Edge | Opera Mobile | Safari Mobile |
---|---|---|---|---|---|---|
Support simple | (Oui) | (Oui) | (Oui) | 12 | (Oui) | (Oui) |
Configurable : true | ? | ? | 38.0 (38) | ? | ? | ? |
Inférence des noms pour les fonctions anonymes | Pas de support | 51.0 | Pas de support [1] | ? | ? | ? |
[1] cf. bug 883377