Sobes.tech
Junior

Co sprawdza operator instanceof w JavaScript?

sobes.tech AI

Odpowiedź od AI

Operator instanceof w JavaScript sprawdza, czy obiekt jest instancją określonej klasy lub konstruktora.

Zasada działania:

  1. Operator instanceof sprawdza obecność prototype konstruktora w łańcuchu prototypów obiektu.
  2. Jeśli prototype konstruktora znajduje się w łańcuchu, wynik to true.
  3. W przeciwnym razie wynik to false.

Przykłady:

// Tworzymy klasę
class Animal {
  // Konstruktor
  constructor(name) {
    this.name = name;
  }
}

// Tworzymy instancję klasy
let dog = new Animal("Buddy");

// Sprawdzamy, czy dog jest instancją Animal
console.log(dog instanceof Animal); // true

// Sprawdzamy, czy dog jest instancją Object (jest, przez łańcuch prototypów)
console.log(dog instanceof Object); // true

// Sprawdzamy, czy dog jest instancją Array (nie jest)
console.log(dog instanceof Array); // false

// Sprawdzanie z typami wbudowanymi
let arr = [1, 2, 3];
console.log(arr instanceof Array); // true
console.log(arr instanceof Object); // true

let num = 123;
console.log(num instanceof Number); // false (dla prymitywów, instanceof zachowuje się specyficznie)
// Dla prymitywów tworzonych przez new
let numObj = new Number(123);
console.log(numObj instanceof Number); // true

Cechy:

  • instanceof działa przez łańcuch prototypów, więc wynik może być true dla konstruktorów nadrzędnych.
  • Dla typów prymitywnych (string, number, boolean, null, undefined, symbol, bigint), instanceof zwykle zwraca false, jeśli nie zostały utworzone przez odpowiedni obiekt opakowujący (new String(), new Number(), itd.).
  • Może być niedokładny przy pracy z różnymi kontekstami wykonania JavaScript (np. różne okna lub iframe), ponieważ każdy kontekst ma własne konstruktory.

Podobne metody do sprawdzania typu:

  • typeof: zwraca łańcuch wskazujący podstawowy typ danych (string, number, boolean, object, function, undefined, symbol, bigint). Nie nadaje się do sprawdzania przynależności do konkretnej klasy.
  • Object.prototype.toString.call(): zwraca dokładniejszy łańcuch z typem obiektu ("[object Array]", "[object Date]", itd.).

Ogólnie, instanceof jest przydatny do sprawdzania, czy obiekt należy do konkretnej klasy lub jej przodków w hierarchii dziedziczenia.