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’objettoStringpeut ê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″>

works for returns typeof primitives string {}.toString primitives, built-in objects, objects with Symbol.toStringTag string instanceof objects true/false

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.