instanceof
Sprawdza, czy obiekt został utworzony przez daną klasę albo przez klasę, która po niej dziedziczy.
- Zwraca
truealbofalse.
Przykład
#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)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
#object instanceof ConstructorParametry
#object
dowolna wartość
Sprawdzana wartość.Constructor
klasa lub funkcja
Klasa, z którą porównujesz. Jeśli nie jest funkcją, operator rzuciTypeError.
Więcej przykładów
#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
}
}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 }))Zwykły obiekt { minutes: 30 } ma to samo pole, ale nie powstał przez new VideoLesson(), więc instanceof zwraca dla niego false.
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)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 tablicArray.isArray().instanceofzostaw dla klas i błędów. - Sprawdzając kilka klas błędów, zaczynaj od najbardziej szczegółowej. Instancja
NoFuelErrorjest też instancjąError, więc kolejność warunków ma znaczenie. - Zamiast długiej listy warunków
instanceofrozważ 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
#- classDefiniuje klasę, czyli szablon do tworzenia obiektów z tymi samymi polami i metodami.
- extendsTworzy klasę pochodną, która dziedziczy metody innej klasy i może je rozszerzać lub nadpisywać.
- typeofZwraca napis z nazwą typu wartości, np. "number", "string" albo "object".
- try...catchPrzechwytuje błędy rzucone w bloku try i obsługuje je w catch. Opcjonalny finally wykona się zawsze.
- Array.isArray()Sprawdza, czy wartość jest tablicą.
- ErrorWbudowany obiekt błędu z komunikatem i śladem stosu. Podstawa wyjątków i własnych klas błędów.
Widzisz błąd albo brakuje przykładu? Napisz do nas.