Comment obtenir un objet de la classe?
J'ai créé un objet JavaScript, mais comment je peux déterminer la classe de cet objet?
Je veux quelque chose de similaire à Java .getClass()
méthode.
- par exemple , je fais une Personne comme ceci : var p = new Personne(); j'ai une Personne de l'Objet qui a appelé "p", comment puis-je utiliser "p" afin de récupérer le nom de la Classe: "Personne".
- Duplicate
- Mise à jour: Comme d'ECMAScript 6, JavaScript n'ai toujours pas de
class
type. C' ne ont unclass
mot-clé etclass
syntaxe pour la création de prototypes dans lequel les méthodes puissent accéder plus facilement àsuper
. - Ce sujet de l'Objet.className?
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas d'équivalent exact de Java
getClass()
en JavaScript. Surtout que c'est dû à JavaScript étant un langage basé sur des prototypes, par opposition à la Java pour une la classe de base un.En fonction de ce que vous avez besoin
getClass()
, il existe plusieurs options en JavaScript:typeof
instanceof
obj.
constructeur
func.
prototype
,proto
.isPrototypeOf
Quelques exemples:
Remarque: si vous compilez votre code avec Uglify il va changer non global des noms de classe. Pour éviter cela, Uglify a un
--mangle
param que vous pouvez définir pour le faux est à l'aide de gulp ou grunt.func.prototype
(oui, les fonctions sont des objets, mais leprototype
propriété n'est pertinente que sur des objets de fonction).instanceof
/isPrototypeOf()
et de la non-standard__proto__
Object.getPrototypeOf()
Function Foo() {}
Foo
joli imprimé. Les commentaires ne doivent pas indiquer la valeur de retour, mais égalités qui tiennent pour les valeurs de retour. Donc le commentaire signifie quefoo.constructor == Foo
détient, qui sera aussi le cas pour vous.class
d'un objet est avecObject.prototype.toString.call(myObject)
. Ce que cette question est vraiment le propos est de mettre le constructeur et/ou du prototype, et non pas la classe, mais il peut être intéressant d'ajouter ceci à des fins d'exhaustivité. Voir cette MDN articlenew this.constructor()
pour instancier une nouvelle instance de l'Objet courant. stackoverflow.com/questions/8453887/...constructor.name
si votre code est minimisé. Le nom de la fonction est en passe de changer arbitrairement.var Foo = () => true;
C'est le retourfunction
chaque fois que vous appelezconsole.log(typeof Foo)
.Foo
est une fonction, mais un constructeur.obj.constructor.name
travaillé un régal!est une méthode fiable dans les navigateurs modernes.
Function.name
a été officiellement ajouté à la norme dans l'ES6, ce qui en fait un conforme aux normes de moyen d'accéder à la "classe" d'un objet JavaScript en tant que chaîne. Si l'objet est instancié avecvar obj = new MyClass()
, il sera de retour "MyClass".Il sera de retour "Nombre" pour les nombres, "Array" pour les tableaux et "Fonctionner" de fonctions, etc. Il se comporte généralement comme prévu. Le seul cas où il échoue si un objet est créé sans un prototype, via
Object.create( null )
, ou de l'objet instancié à partir d'un auteur anonyme-définis (sans nom) de la fonction.Notez également que si vous êtes minifying votre code, il n'est pas sûr à comparer codée en dur de type chaînes de caractères. Par exemple, au lieu de vérifier si
obj.constructor.name == "MyType"
, au lieu de vérifierobj.constructor.name == MyType.name
. Ou il suffit de comparer les constructeurs eux-mêmes, mais ce ne fonctionneront pas dans les DOM frontières, comme il y a différentes instances de la fonction de constructeur sur chaque DOM, faisant ainsi un objet de comparaison sur leurs constructeurs ne fonctionne pas.Remarque lorsque le chaînage des prototypes
Edit: C'est apparemment discutable maintenant que ES6 a un meilleur support pour les classes et l'héritage. Comme adalbertpl explique,
constructor.name
se comporte comme prévu dans le scénario.Curieusement,
constructor.name
retourne le nom de la base de la plupart de fonction utilisé dans une chaîne de prototype, ce qui n'est malheureusement pas intuitif. Par exemple, siB
tire fait deA
et vous créez une nouvelle instance deB
,b
,b.constructor.name
renvoie "A", ce qui semble erroné. Il n'beau travail pour un seul niveau de prototypes et de toutes les primitives, cependant.Function.name
n'est pas (encore) partie de la norme JavaScript. Il est actuellement pris en charge dans Chrome et Firefox, mais pas sous IE(10).Object.create(something).constructor === something.constructor
, ce qui n'est pas tout à fait correct aussi. Donc, obj.le constructeur n'est pas fiable pour tous les objets fabriqués par l'Objet.créer, peu importe avec ou sans un prototype.obj.constructor.name
ne fonctionne que pour les nom fonctions. I. e., si je définirvar Foo = function() {}
, puis pourvar foo = new Foo()
,foo.constructor.name
vous donnera une chaîne vide.constructor.name
si votre code est minimisé. Le nom de la fonction est en passe de changer arbitrairement.class A { }; class B extends A { }; b = new B(); b.constructor.name; "B"
constructor.name
se comporte comme prévu avec la nouvelle classe de soutien dans l'ES6.Cette fonction retourne
"undefined"
,"null"
, ou le"class"
dans[object class]
deObject.prototype.toString.call(someObject)
."Object"
.Pour obtenir le "pseudo-classe", vous pouvez obtenir la fonction de constructeur, par
en supposant que le
constructor
est correctement réglé lorsque vous ne l'héritage, qui est par quelque chose comme:et ces deux lignes, avec:
fera
woofie.constructor
point deDog
. Notez queDog
est une fonction constructeur, et est unFunction
objet. Mais vous pouvez faireif (woofie.constructor === Dog) { ... }
.Si vous voulez obtenir le nom de la classe comme une chaîne de caractères, j'ai trouvé le suivant fonctionne bien:
http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects
Il obtient à la fonction constructeur, la convertit en chaîne, et en extrait le nom de la fonction constructeur.
Noter que
obj.constructor.name
pourrait avoir bien fonctionné, mais il n'est pas standard. C'est sur Chrome et Firefox, mais pas sur IE, y compris IE 9 ou 10 IE RTM.Vous pouvez obtenir une référence à la fonction de constructeur qui a créé l'objet à l'aide de la constructeur de propriété:
Si vous avez besoin de confirmer le type d'un objet au moment de l'exécution, vous pouvez utiliser le instanceof opérateur:
En accord avec son ininterrompue de rétro-compatibilité, ECMAScript 6, JavaScript n'ai toujours pas de
class
type (mais pas tout le monde comprend cela). Il ne ont unclass
mot-clé dans le cadre de sonclass
syntaxe pour la création de prototypes,—mais toujours pas de chose qui s'appelle la classe. Le JavaScript n'est pas maintenant et a jamais été un classique de la programmation orientée objet du langage. En parlant de JS en termes de classe est uniquement soit trompeuse ou d'un signe de pas encore grokking l'héritage par prototype (juste keeping it real).Qui signifie
this.constructor
est encore un excellent moyen pour obtenir une référence à laconstructor
fonction. Etthis.constructor.prototype
est le moyen d'accès le prototype lui-même. Car ce n'est pas Java, il n'est pas une classe. C'est le prototype de l'objet de votre instance a été instancié à partir d'. Voici un exemple d'utilisation de l'ES6 sucre syntaxique pour la création d'un prototype de chaîne:C'est ce que les sorties à l'aide de
babel-node
:Là vous l'avez! En 2016, il y a un
class
mot-clé en JavaScript, mais toujours pas de type de classe.this.constructor
est la meilleure façon d'obtenir la fonction de constructeur,this.constructor.prototype
la meilleure façon d'obtenir l'accès au prototype lui-même.j'ai eu une situation de travail générique maintenant utilisé:
c'est le seul moyen que j'ai trouvé pour obtenir le nom de la classe par type d'entrée si vous n'avez pas une instance d'un objet.
(écrit en ES2017)
point notation fonctionne aussi très bien
Je trouve
object.constructor.toString()
retour[object objectClass]
dans IE ,plutôt que defunction objectClass () {}
retourné dans chome. Donc,je pense que le code dans http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects peut ne pas fonctionner bien sous IE.Et j'ai corrigé le code comme suit:code:
Pour les Classes Javascript dans ES6 vous pouvez utiliser
object.constructor
. Dans l'exemple de la classe en dessous de lagetClass()
méthode renvoie l'ES6 classe que vous attendez:Si vous instancier la classe à partir de la
getClass
méthode assurez-vous d'envelopper dans des supports par exempleruffles = new ( fluffy.getClass() )( args... );
En javascript, il n'y a pas de classes, mais je pense que vous voulez que le constructeur nom et
obj.constructor.toString()
vais vous dire ce dont vous avez besoin..name
..name
n'est pas définie, même sur IE 9D'accord avec le dfae, c'est pourquoi je considère que le prototye que la classe lors de la n de la classe nommée trouvé
Ici est une version améliorée de la fonction de celui posté par Eli Gris, pour correspondre à ma façon de l'esprit
Javascript est une classe de moins de langues: il n'y a pas de classes qui définit le comportement d'une classe de façon statique comme en Java. JavaScript utilise des prototypes au lieu de classes pour définir les propriétés de l'objet, y compris les méthodes, et à l'héritage. Il est possible de simuler de nombreux la classe de base des fonctionnalités à l'aide de prototypes en JavaScript.
class
type. C' ne ont unclass
mot-clé etclass
syntaxe pour la création de prototypes dans lequel les méthodes puissent accéder plus facilement àsuper
.Tenter ma bibliothèque tapuscrit de la classe des auxiliaires:
De cette façon, vous pouvez utiliser vous des noms de classe, même après uglify processus.
Installation:
Voici une mise en œuvre de
getClass()
etgetInstance()
Vous êtes en mesure d'obtenir une référence d'une classe de l'Objet à l'aide de
window
.À partir d'une instance de contexte:
De contexte statique:
this.constructor
?Question semble déjà répondu, mais l'OP veut accéder à la classe de l'objet et de l', tout comme nous le faisons en Java et la réponse choisie n'est pas assez (à mon humble avis).
Avec l'explication suivante, nous pouvons obtenir une classe d'un objet(c'est en fait appelé prototype en javascript).
Vous pouvez ajouter une propriété comme ceci:
Mais
.last
propriété n'est disponible pour "arr
' objet instancié à partir de la Matrice de prototype. Donc, afin d'avoir le.last
propriété disponible pour tous les objets instanciés à partir de la Matrice de prototype, nous avons à définir la.last
propriété pour de la Matrice de prototype:Le problème ici est, vous devez savoir quel type d'objet (prototype) de la
arr
" et "arr2
' variables appartient à! En d'autres termes, si vous ne connaissez pas le type de classe (prototype) de la "arr
' objet, alors vous ne serez pas en mesure de définir une propriété pour eux. Dans l'exemple ci-dessus, nous savons arr est l'instance de l'objet Array, c'est pourquoi nous avons utilisé la Matrice.prototype pour définir une propriété de Tableau. Mais que faire si nous ne connaissons pas la classe(prototype) de la"arr
'?Comme vous pouvez le voir, sans savoir que "
arr
'est un Tableau, nous pouvons ajouter une nouvelle propriété juste bu le renvoi de la classe de la"arr
' aide de 'arr.__proto__
'.Nous avons consulté le prototype de la "
arr
' sans savoir qu'il est une instance de Tableau et je pense que c'est ce que l'OP a demandé.