Comment obtenir de la classe nom de l'objet comme une chaîne de caractères en Javascript?
Disons que j'instancie un objet en Javascript comme ceci:
var myObj = new someObject();
Maintenant, est-il possible d'obtenir le var nom de l'objet en tant que chaîne de 'myObj'
de l'intérieur de l'une des méthodes de la classe?
Plus de détails (édité):
La raison pour laquelle j'aimerais avoir le nom de la variable contenant la référence à l'objet, c'est que mon nouveau myObj
serait de créer un nouveau cliquable DIV
sur la page qui aurait besoin d'appeler une fonction myObj.someFunction()
. Comme je l'ai insérer la nouvelle DIV
j'ai besoin de savoir le nom de la variable contenant la référence à l'objet. Est-il peut-être une meilleure façon de faire cela?
Vous êtes bon, désolé pour le problème de terminologie.
La raison pour laquelle j'aimerais avoir le nom de la variable contenant la référence à l'objet, c'est que mon nouveau myObj de créer une nouvelle DIV cliquable sur la page qui aurait besoin d'appeler une fonction myObj.someFunction(). Comme je l'ai insérer la nouvelle DIV j'ai besoin de savoir le nom de la variable contenant la référence à l'objet. Est-il peut-être une meilleure façon de faire cela?
- Shog9 est correct, pourquoi essayez-vous de le faire? Il y a probablement une meilleure façon d'obtenir ce que vous essayez de faire
- En quelque sorte liée fonction de demande: Suggestion pour ajouter nameof() pour Tapuscrit compilateur. Si jamais cela terres que vous pourriez faire
nameof(myObj) // returns the string "myObj"
Vous devez vous connecter pour publier un commentaire.
Shog9 est juste que cela ne fait pas beaucoup de sens de demander, car un objet peut être désigné par plusieurs variables. Si vous n'avez pas vraiment à ce sujet, et tout ce que vous voulez est de trouver le nom de l'une des variables globales qui se rapporte à cet objet, vous pouvez effectuer les opérations suivantes hack:
Noter que c'est un vilain hack, et ne doit pas être utilisé dans le code de production. Si il n'y a plus d'une variable faisant référence à un objet, vous ne pouvez pas dire lequel vous allez obtenir. Il recherche seulement les variables globales, donc il ne fonctionnera pas si une variable est locale à une fonction. En général, si vous avez besoin de nom de quelque chose, vous devez passer le nom du constructeur, lorsque vous le créez.
modifier: pour répondre À vos précisions, si vous avez besoin d'être en mesure de se référer à quelque chose d'un gestionnaire d'événements, vous ne devriez pas être fait référence par son nom, mais au lieu d'ajouter une fonction qui renvoie directement à l'objet. Voici un petit exemple que j'ai fouetté jusqu'qui montre quelque chose de similaire, je pense, de ce que vous essayez de faire:
Réponse courte: Pas. myObj n'est pas le nom de l'objet, c'est le nom d'une variable contenant une référence à l'objet, vous pourriez avoir un certain nombre d'autres variables de la tenue d'une référence à l'objet même.
Maintenant, si c'est votre programme, puis vous faites les règles: si vous voulez dire que tout objet ne seront référencé par une variable, jamais, et appliquer consciencieusement que dans votre code, puis il suffit de définir une propriété sur l'objet avec le nom de la variable.
Cela dit, je doute que ce que vous demandez est en fait ce que vous voulez vraiment. Peut-être décrire votre problème en détail un peu plus...?
Pédantisme: JavaScript n'a pas de classes.
someObject
est une fonction constructeur. Donné une référence à un objet, vous pouvez obtenir une référence à la fonction qui l'a créé à l'aide de la constructeur de propriété.En réponse à la plus de détails que vous avez fournis:
La réponse que vous cherchez peut être trouvé ici: JavaScript Rappel De La Portée (et en réponse à de nombreuses autres questions sur ce que c'est un point commun de confusion pour ceux qui sont nouveaux à la JS). Vous avez juste besoin d'encapsuler l'appel à l'objet à un membre de la fermeture qui préserve l'accès à l'objet de contexte.
Vous pouvez faire la conversion par le constructeur pour une chaîne à l'aide de .toString() :
obj.constructor.name
Vous pourriez être en mesure d'atteindre votre objectif, en l'utilisant dans une fonction, puis l'examen de la fonction de la source avec
toString()
:Si vous ne souhaitez pas utiliser la fonction constructeur comme dans celui de Brian de réponse, vous pouvez utiliser l'Objet.créer() à la place:-
Étrangement, je ne pouvais pas la ci-dessus pour travailler à l'aide de newDiv.onClick, mais il fonctionne avec newDiv.la méthode addEventListener /newDiv.attachEvent.
Depuis L'Objet.créer est plutôt neuf, ajouter le code suivant à partir de Douglas Crockford pour les anciens navigateurs, y compris IE8.
Plus élémentaires de la situation, il serait bien SI
this
avait une propriété qui pourrait de référence c'est en se référant variable (heads
outails
) mais malheureusement il ne les références de l'instanciation de la nouvellecoinSide
objet.qui affiche toujours
et Firefox Gecko le moteur de montre:
Bien sûr, dans cet exemple, pour résoudre
#1
, et donctoss
, il est assez simple pour testertoss==heads
ettoss==tails
. Cette question, qui est vraiment se demander si le javascript est uncall-by-name
mécanisme, qui motive l'examen de la contrepartie, est-il uncall-by-value
mécanisme pour déterminer la valeur RÉELLE d'une variable? Cet exemple montre que les "valeurs" de deuxheads
ettails
sont identiques, maisalert(heads==tails)
estfalse
.L'auto-référence peut être imposée comme suit:
(en évitant l'objet de l'espace de chasse et les ambiguïtés possibles, comme indiqué dans le Comment obtenir de la classe nom de l'objet comme une chaîne de caractères en Javascript? solution)
pour afficher
heads
outails
.C'est peut-être un anathème à l'essence de Javascript est le langage de conception, comme une interprétation d'une prototypage fonctionnel de la langue, d'avoir de telles capacités, comme primitives.
Une considération finale:
donc, comme prévu ...
"mieux", comme dans la plus facile? Plus facile à programmer? Plus facile à comprendre? Plus facile que dans une exécution plus rapide? Ou est-ce que dans "... et maintenant pour quelque chose de complètement différent"?
... 'an aliased DIV clone'+multiply.div+ ...
et... 'an aliased DIV clone'+alias.div+ ...
de générer à la fois identiquesHTML
source, mais ce dernier ne réside pas dans l'exemple ci-dessus.html
source.eval
primitive N'existe pas! (ET, pour l'honneur de FireFox Gecko enigine, exceptionnellement puissant inverse deeval
, la fonction.toSource()
!)Immédiatement après que l'objet est instantiatd, vous pouvez joindre une propriété, dire
name
, à l'objet et affecter la valeur de la chaîne que vous attendez d'elle:Sinon, l'affectation peut être faite à l'intérieur de l'codes de la classe, c'est à dire
Il y a quelques temps, j'ai utilisé cette.
Peut-être que vous pourriez essayer:
Pop une Alerte:
"I get_this_name"
.C'est assez vieux, mais j'ai couru à travers cette question par l'intermédiaire de Google, donc peut-être que cette solution pourrait être utile à d'autres.
Il utilise juste le navigateur JSON et l'analyseur de regex sans encombrer les DOM ou votre objet de trop.