Sobes.tech
Junior

Čo kontroluje operátor instanceof v JavaScriptu?

sobes.tech AI

Odpoveď od AI

Operátor instanceof v JavaScripte kontroluje, či je objekt inštanciou určitej triedy alebo konštruktora.

Princíp fungovania:

  1. Operátor instanceof kontroluje prítomnosť prototype konštruktora v reťazci prototypov objektu.
  2. Ak je prototype konštruktora prítomný v reťazci, výsledok je true.
  3. Inak je výsledok false.

Príklady:

// Vytvoríme triedu
class Animal {
  // Konštruktor
  constructor(name) {
    this.name = name;
  }
}

// Vytvoríme inštanciu triedy
let dog = new Animal("Buddy");

// Kontrolujeme, či je dog inštanciou Animal
console.log(dog instanceof Animal); // true

// Kontrolujeme, či je dog inštanciou Object (je, cez reťazec prototypov)
console.log(dog instanceof Object); // true

// Kontrolujeme, či je dog inštanciou Array (nie je)
console.log(dog instanceof Array); // false

// Kontrola s vestavěnými typmi
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 (pre primityvy instanceof správa špecificky)
// Pre primityvy vytvorené cez new
let numObj = new Number(123);
console.log(numObj instanceof Number); // true

Špeciálne vlastnosti:

  • instanceof funguje cez reťazec prototypov, takže výsledok môže byť true aj pre rodičovské konštruktory.
  • Pre primityvy typy (string, number, boolean, null, undefined, symbol, bigint), instanceof zvyčajne vracia false, ak neboli vytvorené cez príslušný obalový objekt (new String(), new Number() a pod.).
  • Môže byť nepresný pri práci s rôznymi kontextmi vykonávania JavaScriptu (napríklad s rôznymi oknami prehliadača alebo iframe), pretože každý kontext má vlastné konštruktory.

Podobné prístupy na kontrolu typu:

  • typeof: Vráti reťazec označujúci základný dátový typ (string, number, boolean, object, function, undefined, symbol, bigint). Nie je vhodný na kontrolu príslušnosti ku konkrétnej triede.
  • Object.prototype.toString.call(): Vráti presnejší reťazec s typom objektu ("[object Array]", "[object Date]" a pod.).

Celkovo je instanceof užitočný na kontrolu, či je objekt priradený ku konkrétnej triede alebo jej predkovi v dedičskej hierarchii.