l’opérateur instanceof
permet de vérifier si un objet appartient à une certaine classe. Il prend également de l’héritage en compte.
Une telle vérification peut être nécessaire dans de nombreux cas. Par exemple, il peut être utilisé pour construire une fonction polymorphe, celle qui traite les arguments différemment en fonction de leur type.,
L’opérateur instanceof
la syntaxe est La suivante:
obj instanceof Class
Elle retourne true
si obj
appartient à la balise Class
ou une classe héritant de il.,
Par exemple:
class Rabbit {}let rabbit = new Rabbit();// is it an object of Rabbit class?alert( rabbit instanceof Rabbit ); // true
Il fonctionne également avec les fonctions constructeur:
// instead of classfunction Rabbit() {}alert( new Rabbit() instanceof Rabbit ); // true
…Et avec construit-dans les classes comme le Array
:
let arr = ;alert( arr instanceof Array ); // truealert( arr instanceof Object ); // true
Veuillez noter que le arr
appartient également à la balise Object
de classe., C’est parce que Array
fait hérite de Object
.
normalement,instanceof
examine la chaîne prototype pour la vérification. Nous pouvons également définir une logique personnalisée dans la méthode statique Symbol.hasInstance
.,
L’algorithme de obj instanceof Class
fonctionne à peu près comme suit:
Voici l’illustration de ce que rabbit instanceof Animal
compare avec des Animal.prototype
:
En passant, il y a aussi une méthode objA.isPrototypeOf(objB), qui renvoie true
si objA
est quelque part dans la chaîne de prototypes pour le objB
., Donc, le test de obj instanceof Class
peut être reformulé comme Class.prototype.isPrototypeOf(obj)
.
c’est drôle, mais le constructeur Class
lui-même ne participe pas à la vérification! Seule la chaîne de prototypes et Class.prototype
compte.
cela peut avoir des conséquences intéressantes lorsqu’une propriétéprototype
est modifiée après la création de l’objet.
Comme ici:
Bonus: Objet.prototype.,toString pour le type
Nous savons déjà que les objets simples sont convertis à la chaîne :
let obj = {};alert(obj); // alert(obj.toString()); // the same
C’est la mise en œuvre de toString
. Mais il y a une fonctionnalité cachée qui rend toString
en fait beaucoup plus puissant que cela. Nous pouvons l’utiliser comme une extension de typeof
et un autre pour le instanceof
.
Sons étranges? Effectivement. Nous allons démystifier.,
par spécification, letoString
intégré peut être extrait de l’objet et exécuté dans le contexte de toute autre valeur. Et son résultat dépend de cette valeur.
nous allons démontrer:
Ici, nous avons utilisé l’appeler comme décrit dans le chapitre Décorateurs et renvoi d’appel/s’appliquent à exécuter la fonction objectToString
le contexte this=arr
.
en Interne, la balise toString
algorithme examine this
et renvoie le résultat correspondant. Plus d’exemples:
symbole.,toStringTag
le comportement de L’objettoString
peut être personnalisé à l’aide d’une propriété d’objet spécialeSymbol.toStringTag
.
Par exemple:
let user = { : "User"};alert( {}.toString.call(user) ); //
Pour plus spécifiques à l’environnement des objets, il ya une telle propriété. Voici quelques navigateur exemples précis:
Comme vous pouvez le voir, le résultat est exactement Symbol.toStringTag
(s’il existe), enveloppé dans .,
à la fin, nous avons « typeof on steroids” qui fonctionne non seulement pour les types de données primitifs, mais aussi pour les objets intégrés et peut même être personnalisé.
On peut utiliser {}.toString.call
au lieu de instanceof
pour les objets intégrés lorsque nous voulons obtenir le type d’une chaîne plutôt que juste pour vérifier.,4012″>
typeof
{}.toString
Symbol.toStringTag
instanceof
As we can see, {}.toString
is technically a « more advanced” typeof
.,
etinstanceof
l’opérateur brille vraiment lorsque nous travaillons avec une hiérarchie de classes et que nous voulons vérifier la classe en tenant compte de l’héritage.
Laisser un commentaire