Sobes.tech
Junior

Co kontroluje operátor instanceof v JavaScriptu?

sobes.tech AI

Odpověď od AI

Operátor instanceof v JavaScriptu kontroluje, zda je objekt instance určité třídy nebo konstruktoru.

Princip fungování:

  1. Operátor instanceof kontroluje, zda je prototype konstruktoru přítomen v řetězci prototypů objektu.
  2. Pokud je prototype konstruktoru v řetězci, výsledek je true.
  3. Jinak je výsledek false.

Příklady:

// Vytvoření třídy
class Animal {
  // Konstruktor
  constructor(name) {
    this.name = name;
  }
}

// Vytvoření instance třídy
let dog = new Animal("Buddy");

// Kontrola, zda je dog instance třídy Animal
console.log(dog instanceof Animal); // true

// Kontrola, zda je dog instance třídy Object (je, přes řetězec prototypů)
console.log(dog instanceof Object); // true

// Kontrola, zda je dog instance pole (není)
console.log(dog instanceof Array); // false

// Kontrola s vestavěnými typy
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 (u primitivních typů se `instanceof` chová specificky)
// U primitivních typů vytvořených pomocí new
let numObj = new Number(123);
console.log(numObj instanceof Number); // true

Vlastnosti:

  • instanceof funguje přes řetězec prototypů, takže výsledek může být true i pro rodičovské konstruktory.
  • U primitivních typů (string, number, boolean, null, undefined, symbol, bigint) instanceof obvykle vrací false, pokud nebyly vytvořeny pomocí odpovídajícího obalového objektu (new String(), new Number(), atd.).
  • Může být nepřesný při práci s různými kontexty vykonávání JavaScriptu (například s různými okny nebo iframe), protože každý kontext má své vlastní konstruktory.

Podobné přístupy pro kontrolu typu:

  • typeof: vrací řetězec označující základní typ dat (string, number, boolean, object, function, undefined, symbol, bigint). Není vhodný pro kontrolu příslušnosti ke konkrétní třídě.
  • Object.prototype.toString.call(): vrací přesnější řetězec s typem objektu ("[object Array]", "[object Date]", atd.).

Obecně je instanceof užitečný pro kontrolu, zda objekt patří do určité třídy nebo jejího předka v hierarchii dědičnosti.