instanceof

Vérifie si un objet a été créé par une classe donnée, ou par une classe qui en hérite.

Renvoie
true ou false.
Sur cette page

Exemple

#
JavaScript
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)
Console
true
true
true
false

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

#
Syntaxe
object instanceof Constructor

Paramè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 une TypeError.

Plus d’exemples

#
Reconnaître le type d’erreur
JavaScript
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
  }
}
Console
Revenez demain, ou passez à un compte premium
Différentes classes dans une seule fonction
JavaScript
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 }))
Console
12
5
0

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.

Primitifs et tableaux
JavaScript
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)
Console
false
string
true
true
false

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éservez instanceof aux classes et aux erreurs.
  • En vérifiant plusieurs classes d’erreur, commencez par la plus spécifique. Une instance de NoFuelError est aussi une instance de Error, donc l’ordre des conditions compte.
  • Plutôt qu’une longue liste de conditions instanceof, envisagez une méthode commune, comme duration(), que chaque classe implémente à sa façon. Le code sera plus court et plus facile à faire évoluer.

Entrées associées

#

Vous voyez une erreur ou il manque un exemple ? Écrivez-nous.