instanceof
Vérifie si un objet a été créé par une classe donnée, ou par une classe qui en hérite.
- Renvoie
trueoufalse.
Exemple
#class Exercise {}
class Quiz extends Exercise {}
const quiz = new Quiz()
console.log(quiz instanceof Quiz)
console.log(quiz instanceof Exercise)
console.log(quiz instanceof Object)
console.log(new Exercise() instanceof Quiz)Définition et utilisation
#L’opérateur instanceof renvoie true si le prototype de la classe donnée se trouve dans la chaîne de prototypes de l’objet. En pratique, il répond à la question de savoir si un objet est une instance de cette classe ou d’une de ses classes dérivées.
On l’utilise le plus souvent pour reconnaître le type d’une erreur dans un bloc catch (error instanceof TypeError) et pour distinguer des objets de classes différentes dans une même fonction. Comme il tient compte de l’héritage, une instance de Quiz extends Exercise est à la fois une instance de Exercise et de Object.
Pour les valeurs primitives, comme les chaînes et les nombres, le résultat est toujours false, car elles ne sont pas des objets. Pour elles, utilisez typeof, et pour les tableaux, Array.isArray() est plus fiable. instanceof peut aussi échouer pour des objets venant d’une autre fenêtre, par exemple d’un iframe, qui a ses propres classes natives.
Syntaxe
#object instanceof ConstructorParamètres
#object
valeur quelconque
La valeur vérifiée.Constructor
classe ou fonction
La classe à laquelle vous comparez. Si ce n’est pas une fonction, l’opérateur lève uneTypeError.
Plus d’exemples
#class NoFuelError extends Error {}
function startLesson(fuel) {
if (fuel <= 0) throw new NoFuelError('Plus de carburant')
return 'Leçon commencée'
}
try {
startLesson(0)
} catch (error) {
if (error instanceof NoFuelError) {
console.log('Revenez demain, ou passez à un compte premium')
} else {
throw error
}
}class TextLesson {
constructor(words) {
this.words = words
}
}
class VideoLesson {
constructor(minutes) {
this.minutes = minutes
}
}
function duration(lesson) {
if (lesson instanceof VideoLesson) return lesson.minutes
if (lesson instanceof TextLesson) return Math.ceil(lesson.words / 200)
return 0
}
console.log(duration(new VideoLesson(12)))
console.log(duration(new TextLesson(900)))
console.log(duration({ minutes: 30 }))L’objet ordinaire { minutes: 30 } a le même champ, mais il n’a pas été créé avec new VideoLesson(), donc instanceof renvoie false pour lui.
console.log('texte' instanceof String)
console.log(typeof 'texte')
console.log([1, 2] instanceof Array)
console.log(Array.isArray([1, 2]))
console.log(null instanceof Object)Compatibilité des navigateurs
#Largement disponible
Fonctionne dans tous les navigateurs modernes, y compris sur mobile. Vous pouvez l’utiliser sans crainte.
- Chrome
- Edge
- Firefox
- Safari
Bonnes pratiques
#- Pour les types simples, utilisez
typeof, et pour les tableaux,Array.isArray(). Réservezinstanceofaux classes et aux erreurs. - En vérifiant plusieurs classes d’erreur, commencez par la plus spécifique. Une instance de
NoFuelErrorest aussi une instance deError, donc l’ordre des conditions compte. - Plutôt qu’une longue liste de conditions
instanceof, envisagez une méthode commune, commeduration(), que chaque classe implémente à sa façon. Le code sera plus court et plus facile à faire évoluer.
Entrées associées
#- classDéfinit une classe, c’est-à-dire un modèle pour créer des objets avec les mêmes champs et méthodes.
- extendsCrée une classe dérivée qui hérite des méthodes d’une autre classe et peut les étendre ou les redéfinir.
- typeofRenvoie une chaîne avec le nom du type d’une valeur, par ex. "number", "string" ou "object".
- try...catchCapture les erreurs levées dans un bloc try et les traite dans catch. Un finally optionnel s’exécute toujours.
- Array.isArray()Vérifie si une valeur est un tableau.
- ErrorUn objet d’erreur intégré avec un message et une pile d’appels. La base des exceptions et des classes d’erreurs personnalisées.
Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.