J'ai créé un objet JavaScript, mais comment puis-je déterminer la classe de cet objet?
Je veux quelque chose de similaire à la .getClass()
méthode Java .
javascript
oop
DNB5brims
la source
la source
class
type. Il ne unclass
mot - clé et laclass
syntaxe pour la création de prototypes dans lesquels les méthodes peuvent accéder plus facilementsuper
.Réponses:
Il n'y a pas d'équivalent exact à Java
getClass()
en JavaScript. Cela est principalement dû au fait que JavaScript est un langage basé sur un prototype , par opposition à Java un langage basé sur une classe .Selon ce dont vous avez besoin
getClass()
, il existe plusieurs options en JavaScript:typeof
instanceof
obj.
constructor
func.
prototype
,proto
.isPrototypeOf
Quelques exemples:
Remarque: si vous compilez votre code avec Uglify, cela changera les noms de classe non globaux. Pour éviter cela, Uglify a un paramètre
--mangle
que vous pouvez définir sur false en utilisant gulp ou grunt .la source
func.prototype
(oui, les fonctions sont des objets, mais laprototype
propriété n'est pertinente que sur les objets fonction).instanceof
/isPrototypeOf()
et le non standard__proto__
Object.getPrototypeOf()
constructor.name
votre code. Le nom de la fonction va changer arbitrairement.construction.name
comme un jeton à ignorer / ne pas minimiser. En outre, la plupart (sinon la totalité) des logiciels de minification fournissent des règles d'exception.est une méthode fiable dans les navigateurs modernes.
Function.name
a été officiellement ajouté à la norme dans ES6, ce qui en fait un moyen conforme aux normes d'obtenir la "classe" d'un objet JavaScript sous forme de chaîne. Si l'objet est instancié avecvar obj = new MyClass()
, il renverra "MyClass".Il renverra "Number" pour les nombres, "Array" pour les tableaux et "Function" pour les fonctions, etc. Il se comporte généralement comme prévu. Les seuls cas où il échoue sont si un objet est créé sans prototype, via
Object.create( null )
ou si l'objet a été instancié à partir d'une fonction définie de manière anonyme (sans nom).Notez également que si vous réduisez votre code, il n'est pas sûr de comparer avec des chaînes de type codées en dur. Par exemple, au lieu de vérifier si
obj.constructor.name == "MyType"
, vérifiez plutôtobj.constructor.name == MyType.name
. Ou comparez simplement les constructeurs eux-mêmes, mais cela ne fonctionnera pas au-delà des limites du DOM car il existe différentes instances de la fonction de constructeur sur chaque DOM, donc faire une comparaison d'objets sur leurs constructeurs ne fonctionnera pas.la source
Function.name
ne fait pas (encore) partie du standard JavaScript. Il est actuellement pris en charge dans Chrome et Firefox, mais pas dans IE (10).obj.constructor.name
ne fonctionne que pour les fonctions nommées . C'est à dire, si je définisvar Foo = function() {}
, alors pourvar foo = new Foo()
,foo.constructor.name
vous donnera une chaîne vide.constructor.name
votre code. Le nom de la fonction va changer arbitrairement.constructor.name
se comporte comme prévu avec le nouveau support de classe dans ES6.Cette fonction renvoie
"Undefined"
pour les valeurs non définies et"Null"
pour null.Pour toutes les autres valeurs, la
CLASSNAME
partie-est extraite de[object CLASSNAME]
, qui est le résultat de l'utilisationObject.prototype.toString.call(value)
.la source
"Object"
.return obj.constructor.name
. Cela donne les mêmes résultats et gère également les objets non natifs.Pour obtenir la "pseudo classe", vous pouvez obtenir la fonction constructeur, en
en supposant que le
constructor
est correctement défini lorsque vous effectuez l'héritage - ce qui est par quelque chose comme:et ces deux lignes, ainsi que:
fera
woofie.constructor
remarquerDog
. Notez qu'ilDog
s'agit d'une fonction constructeur et d'unFunction
objet. Mais tu peux le faireif (woofie.constructor === Dog) { ... }
.Si vous voulez obtenir le nom de la classe sous forme de chaîne, j'ai trouvé que ce qui suit fonctionnait bien:
http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects
Il accède à la fonction constructeur, la convertit en chaîne et extrait le nom de la fonction constructeur.
Notez que cela
obj.constructor.name
aurait pu bien fonctionner, mais ce n'est pas standard. C'est sur Chrome et Firefox, mais pas sur IE, y compris IE 9 ou IE 10 RTM.la source
Vous pouvez obtenir une référence à la fonction constructeur qui a créé l'objet en utilisant la propriété constructeur :
Si vous devez confirmer le type d'un objet au moment de l'exécution, vous pouvez utiliser l' opérateur instanceof :
la source
Conformément à son record ininterrompu de compatibilité descendante, ECMAScript 6, JavaScript n'a toujours pas de
class
type (bien que tout le monde ne le comprenne pas). Il ne unclass
mot - clé dans le cadre de saclass
syntaxe pour la création de prototypes, mais toujours pas de chose appelée classe . JavaScript n'est pas maintenant et n'a jamais été un langage OOP classique . Parler de JS en termes de classe n'est que trompeur ou un signe d'héritage prototypique pas encore bouleversant (juste le garder réel).Cela signifie que
this.constructor
c'est toujours un excellent moyen d'obtenir une référence à laconstructor
fonction. Etthis.constructor.prototype
c'est le moyen d'accéder au prototype lui-même. Comme ce n'est pas Java, ce n'est pas une classe. C'est l'objet prototype à partir duquel votre instance a été instanciée. Voici un exemple utilisant le sucre syntaxique ES6 pour créer une chaîne prototype:C'est ce qui sort en utilisant
babel-node
:Voilà! En 2016, il y a un
class
mot - clé en JavaScript, mais toujours pas de type de classe.this.constructor
est le meilleur moyen d'obtenir la fonction constructeur,this.constructor.prototype
le meilleur moyen d'accéder au prototype lui-même.la source
j'avais une situation pour travailler générique maintenant et utilisé ceci:
c'est le seul moyen que j'ai trouvé pour obtenir le nom de classe par type d'entrée si vous n'avez pas d'instance d'objet.
(écrit en ES2017)
la notation par points fonctionne également très bien
la source
Pour les classes Javascript dans ES6, vous pouvez utiliser
object.constructor
. Dans l'exemple de classe ci-dessous, lagetClass()
méthode renvoie la classe ES6 comme prévu:Si vous instanciez la classe à partir de la
getClass
méthode, assurez-vous de la mettre entre crochets, par exempleruffles = new ( fluffy.getClass() )( args... );
la source
Je trouve le
object.constructor.toString()
retour[object objectClass]
dans IE, plutôt quefunction 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 bien fonctionner dans IE.Et j'ai corrigé le code comme suit:code:
la source
En javascript, il n'y a pas de classes, mais je pense que vous voulez le nom du constructeur et
obj.constructor.toString()
vous direz ce dont vous avez besoin.la source
.name
..name
n'est pas défini même sur IE 9D'accord avec dfa, c'est pourquoi je considère le prototye comme la classe quand aucune classe nommée n'a été trouvée
Voici une fonction améliorée de celle publiée par Eli Gray, pour correspondre à ma façon de penser
la source
Si vous devez non seulement obtenir la classe GET, mais aussi la prolonger de la simple présence d'une instance, écrivez:
nous allons avoir
afin d'étendre A en utilisant uniquement l'instance:
la source
Je suggère d'utiliser
Object.prototype.constructor.name
:la source
Voici une implémentation de
getClass()
etgetInstance()
Vous pouvez obtenir une référence pour la classe d'un objet en utilisant
this.constructor
.À partir d'un contexte d'instance:
Du contexte statique:
la source
this.constructor
?Vous pouvez également faire quelque chose comme ça
Cela vous dira si l'entrée est de classe ou non
la source
Javascript est un langage sans classe: il n'y a pas de classe qui définit statiquement le comportement d'une classe comme en Java. JavaScript utilise des prototypes au lieu de classes pour définir les propriétés des objets, y compris les méthodes et l'héritage. Il est possible de simuler de nombreuses fonctionnalités basées sur des classes avec des prototypes en JavaScript.
la source
class
type. Il ne unclass
mot - clé et laclass
syntaxe pour la création de prototypes dans lesquels les méthodes peuvent accéder plus facilementsuper
.La question semble déjà répondue mais l'OP veut accéder à la classe de et objet, tout comme nous le faisons en Java et la réponse sélectionnée n'est pas suffisante (à mon humble avis).
Avec l'explication suivante, nous pouvons obtenir une classe d'un objet (il est en fait appelé prototype en javascript).
Vous pouvez ajouter une propriété comme celle-ci:
Mais la
.last
propriété ne sera disponible que pourarr
l'objet ' ' qui est instancié à partir du prototype Array. Donc, pour que la.last
propriété soit disponible pour tous les objets instanciés à partir du prototype Array, nous devons définir la.last
propriété pour le prototype Array:Le problème ici est que vous devez savoir à quel type d'objet (prototype) les variables '
arr
' et 'arr2
' appartiennent! En d'autres termes, si vous ne connaissez pas le type de classe (prototype) de l'arr
objet ' ', vous ne pourrez pas leur définir de propriété. Dans l'exemple ci-dessus, nous savons que arr est une instance de l'objet Array, c'est pourquoi nous avons utilisé Array.prototype pour définir une propriété pour Array. Et si nous ne connaissions pas la classe (prototype) du 'arr
'?Comme vous pouvez le voir, sans savoir que «
arr
» est un tableau, nous pouvons ajouter une nouvelle propriété en référençant simplement la classe du «arr
» en utilisant «arr.__proto__
».Nous avons accédé au prototype du '
arr
' sans savoir qu'il s'agit d'une instance d'Array et je pense que c'est ce que OP a demandé.la source
__proto__
propriété est obsolète et n'a presque aucun avantage sur laprototype
propriété.