Function.name

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 ES2015, l'attribut configurable valait false également.

Description

La propriété name renvoie le nom d'une fonction ou bien (pour les implémentations pré-ES2015) 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 ES2015 peuvent inférer le nom de la fonction anonyme grâce à sa position syntaxique. Ainsi :

var f = function() {};
console.log(f.name);  // 'f' avec ES2015

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). Avec ES2015 et l'apparition du mot-clé static, les méthodes statiques seront rattachées à la fonction qui représente la classe sous forme de propriétés propres. Aussi, si on a une méthode statique qui s'appelle name(), on ne pourra pas récupérer le nom de la classe !

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

Étiquettes et contributeurs liés au document

 Contributeurs à cette page : SphinxKnight, teoli
 Dernière mise à jour par : SphinxKnight,