JavaScriptObiekty i klasy

instanceof

Sprawdza, czy obiekt został utworzony przez daną klasę albo przez klasę, która po niej dziedziczy.

Zwraca
true albo false.
Na tej stronie

Przykład

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

Definicja i zastosowanie

#

Operator instanceof zwraca true, jeśli w łańcuchu prototypów obiektu znajduje się prototype podanej klasy. W praktyce odpowiada na pytanie, czy obiekt jest instancją tej klasy albo którejś z jej klas pochodnych.

Najczęściej używa się go do rozpoznawania rodzaju błędu w bloku catch (error instanceof TypeError) i do rozróżniania obiektów różnych klas w jednej funkcji. Ponieważ uwzględnia dziedziczenie, instancja klasy Quiz extends Exercise jest jednocześnie instancją Exercise i Object.

Dla wartości prymitywnych, takich jak napisy i liczby, wynik zawsze jest false, bo nie są obiektami. Do nich służy typeof, a do tablic pewniejsze jest Array.isArray(). instanceof może też zawieść dla obiektów pochodzących z innego okna, np. z ramki iframe, która ma własne klasy wbudowane.

Składnia

#
Składnia
object instanceof Constructor

Parametry

#
  • object

    dowolna wartość

    Sprawdzana wartość.
  • Constructor

    klasa lub funkcja

    Klasa, z którą porównujesz. Jeśli nie jest funkcją, operator rzuci TypeError.

Więcej przykładów

#
Rozpoznawanie rodzaju błędu
JavaScript
class NoFuelError extends Error {}

function startLesson(fuel) {
  if (fuel <= 0) throw new NoFuelError('Brak paliwa')
  return 'Lekcja rozpoczęta'
}

try {
  startLesson(0)
} catch (error) {
  if (error instanceof NoFuelError) {
    console.log('Wróć jutro albo przejdź na konto premium')
  } else {
    throw error
  }
}
Konsola
Wróć jutro albo przejdź na konto premium
Różne klasy w jednej funkcji
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 }))
Konsola
12
5
0

Zwykły obiekt { minutes: 30 } ma to samo pole, ale nie powstał przez new VideoLesson(), więc instanceof zwraca dla niego false.

Prymitywy i tablice
JavaScript
console.log('tekst' instanceof String)
console.log(typeof 'tekst')
console.log([1, 2] instanceof Array)
console.log(Array.isArray([1, 2]))
console.log(null instanceof Object)
Konsola
false
string
true
true
false

Obsługa przeglądarek

#

Szeroko dostępne

Działa we wszystkich nowoczesnych przeglądarkach, także na telefonach. Możesz używać bez obaw.

  • Chrome
  • Edge
  • Firefox
  • Safari

Dobre praktyki

#
  • Do typów prostych używaj typeof, a do tablic Array.isArray(). instanceof zostaw dla klas i błędów.
  • Sprawdzając kilka klas błędów, zaczynaj od najbardziej szczegółowej. Instancja NoFuelError jest też instancją Error, więc kolejność warunków ma znaczenie.
  • Zamiast długiej listy warunków instanceof rozważ wspólną metodę, np. duration(), którą każda klasa zapisze po swojemu. Kod będzie krótszy i łatwiejszy do rozbudowy.

Powiązane hasła

#

Widzisz błąd albo brakuje przykładu? Napisz do nas.