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