Comment obtenir le nom de la classe JavaScript

Prenons le code exemple suivant:

var ns = {}; // Some namespace ns.Test = function() { // Constructor of class Test }; var inst = new ns.Test(); var className = hereIsTheMagic(inst); // Must return "ns.Test" 

Je crée donc une classe nommée 'Test' dans l'espace de noms 'ns' et une instance de cette classe nommée 'inst'. Maintenant, je veux savoir le nom de la classe. Comment puis-je faire ceci?

Jusqu'à présent, j'ai résolu ce problème en donnant à chaque classe une propriété de chaîne avec le nom de la classe afin que je puisse utiliser inst.constructor.className pour accéder au nom de la classe. Mais si possible, je voudrais arrêter de le faire car il est très propice aux erreurs lors de la copie / collage des classes.

S'il n'y a pas de solution qui fonctionne dans tous les navigateurs actuels, peut-être existe-t-il au moins une nouvelle fonctionnalité dans une future spécification ECMAScript qui permet d'accéder aux noms de classe?

JavaScript n'a pas de cours, il possède des fonctions de constructeur et la chaîne de prototypes. Ensemble, ils peuvent ressembler un peu aux cours, mais ils ne le sont pas vraiment. 🙂

Non, il n'y a pas de manière standard hereIsTheMagic peut trouver la chaîne "ns.Test" dans votre exemple, pas même dans ECMAScript 5. Pour une chose, ns.Test peut ne pas être la seule propriété faisant référence à cette fonction (et si vous avez ajouté ns.OtherTest = ns.Test; , par exemple).

JavaScript a le concept de fonctions ayant des noms appropriés, mais il n'y a aucun moyen standard pour accéder au nom propre d'une fonction, et même si vous le pouvez, la fonction que vous appelez ns.Test est anonyme . La propriété sur laquelle vous l'avez affecté ns a un nom ( Test ), mais la fonction ne l'est pas.

Vous pouvez donner à la fonction un nom:

 var ns = {}; // Some namespace (function() { ns.Test = ns_Test; function ns_Test() { // Constructor of class Test } })(); 

… ce qui est une bonne idée, car cela aide les outils à vous aider , mais il n'y a pas de moyen standard pour le code JavaScript lui-même pour obtenir ce nom. (Ne faites pas ns.Test = function ns_Test() { ... }; cependant, il devrait fonctionner, mais il existe diverses implémentations d'ECMAScript qui ont des bugs différents. Plus à propos de cela dans l'article ci-dessus . )


Mise à jour : Je devrais probablement avoir dit: Il existe des méthodes non standard pour obtenir le nom propre d'une fonction ( ns_Test dans mon exemple ci-dessus).

La plus simple est la propriété de name sur les instances de fonction, qui est pris en charge par de nombreuses implémentations, y compris:

  • Firefox SpiderMonkey
  • Chrome V8
  • Le moteur de l'opéra (je ne sais pas son nom)
  • Le moteur Safari (y compris le mobile Safari)

… donc alert(ns_Test.name); Alerterait "ns_Test". Mais il est non- standard et n'est pas pris en charge par aucune version de JScript (moteur de Microsoft), même pas la version utilisée par IE9 (enfin enfin publiée!). Voici une page de testeur rapide: http://jsbin.com/oxuva3

Notez que, encore une fois, c'est le nom propre de la fonction (voir mon exemple ci-dessus), et non le nom de la propriété à laquelle vous l'avez assigné.

Si le name n'est pas là, vous pouvez utiliser toString() sur l'objet de fonction, qui peut (ou ne pas) renvoyer une représentation de chaîne de la fonction (p. Ex., "Function ns_Test () {…}"). C'est complètement non standard, mais commun sur les navigateurs de bureau; Cela ne fonctionne pas sur plusieurs navigateurs mobiles, et probablement une mauvaise idée en tout cas. 🙂