Tento překlad není kompletní. Prosím pomozte přeložit tento článek z angličtiny.

Operátor instanceof otestuje zdali vlastnost prototype konstruktoru se objevuje kdekoli v stromu prototypu daného objektu.

Syntaxe

object instanceof constructor

Parametry

object
Object k otestování.
constructor
Funkce na otestování naproti objektu.

Description

Operátor instanceof testuje přítomnost constructor.prototype v prototypovém stromu objectu.

// defining constructors
function C() {}
function D() {}

var o = new C();

// true, protože: Object.getPrototypeOf(o) === C.prototype
o instanceof C;

// false, protože D.prototype není nikde v o prototypovém stromu 
o instanceof D;

o instanceof Object; // true, protože:
C.prototype instanceof Object // true

C.prototype = {};
var o2 = new C();

o2 instanceof C; // true

// false, because C.prototype už není v prototypovém stromu o
o instanceof C; 

D.prototype = new C(); // přidání C do [[Prototype]] pro spojení s D
var o3 = new D();
o3 instanceof D; // true
o3 instanceof C; // true protože C.prototype již nyní je v o3 prototypovém stromu

Všimněte si, že hodnota instanceof se může měnit na základě změn u vlastností prototypů konstruktorů a také může být změněn prototyp objektu použitím Object.setPrototypeOf. Také je možné použít nestandartní pseudo vlastnost __proto__.

instanceof a více kontektů (např. frames nebo windows)

Různé kontexty mají různá prostředí. To znamená, že mají např. různé vestavěné globální objekty, různé konstruktory, atd.). To může vést k neočekávaným výsledkům. Například, [] instanceof window.frames[0].Array vrátí false, protože Array.prototype !== window.frames[0].Array  a pole dědí ze dříve jmenovaného.

Na první pohled to nemusí dávat smysl, ale pokud začnete pracovat s více framy nebo window ve vašem skripru a budete předávat objekt z jednoho kontextu do dalšího přes funkce, tak to bude velký problém. Například můžete bezpečně zkontrolovat, jestliže daný objekt je ve skutečnosti pole použitím Array.isArray(myObj)

Například pro kontrolu toho, jestliže Nodes je SVGElement v jiném kontextu můžete použít myNode instanceof myNode.ownerDocument.defaultView.SVGElement

Poznámka pro Mozilla vývojáře:
V kódu použitím XPCOM instanceof má speciální účinek: obj instanceof xpcomInterface (např. Components.interfaces.nsIFile) volá obj.QueryInterface(xpcomInterface) a vrací true jestliže QueryInterface uspěla. Nevýhodou takového zavolání je fakt, že můžete použít vlastnosti xpcomInterface na obj po úspěšném testu instanceof. Narozdíl od standartních JavaScriptových globálních objektů, test obj instanceof xpcomInterface funguje tak jak by měl i přes to, jestliže obj je z jiného kontextu.

Příklady

Ukázky, že StringDate jsou v některých případech typem Object

Následující kód používá instanceof na ukázku toho, že String a Date objekty jsou také typu Object (jsou odvozeny z Object).

Avšak objekty vytvořené s doslovným zápisem jsou zde vyjímkami: Ačkoli prototyp je undefined, instanceof Object vrací true.

var simpleStr = 'This is a simple string'; 
var myString  = new String();
var newStr    = new String('String created with constructor');
var myDate    = new Date();
var myObj     = {};
var myNonObj  = Object.create(null);

simpleStr instanceof String; // returns false, checks the prototype chain, finds undefined
myString  instanceof String; // returns true
newStr    instanceof String; // returns true
myString  instanceof Object; // returns true

myObj    instanceof Object;    // returns true, despite an undefined prototype
({})     instanceof Object;    // returns true, same case as above
myNonObj instanceof Object;    // returns false, a way to create an object that is not an instance of Object

myString instanceof Date;   // returns false

myDate instanceof Date;     // returns true
myDate instanceof Object;   // returns true
myDate instanceof String;   // returns false

Ukázka toho, že mycar je typem Car a typem Object

Následující kód vytvoří typ objektu Car a instanci tohoto typu objektu - mycar. Operátor instanceof nám ukáže, že objekt mycar je typem Car a typem Object.

function Car(make, model, year) {
  this.make = make;
  this.model = model;
  this.year = year;
}
var mycar = new Car('Honda', 'Accord', 1998);
var a = mycar instanceof Car;    // returns true
var b = mycar instanceof Object; // returns true

Negace instanceof

K otestování objektu, který není instancí specifického kostruktoru můžete udělat

if (!(mycar instanceof Car)) {
  // Udělej něco jako: mycar = new Car(mycar)
}

Toto je naprosto odlišné od

if (!mycar instanceof Car)

toto bude vždy false (výraz !mycar bude vykonán ještě před instanceof, takže tím budete zkoušet zjištovat, jestliže boolean je instancí Car).

Specifikace

Specifikace Status Komentář
ECMAScript Latest Draft (ECMA-262)
The definition of 'Relational Operators' in that specification.
Draft  
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Relational Operators' in that specification.
Standard  
ECMAScript 5.1 (ECMA-262)
The definition of 'The instanceof operator' in that specification.
Standard  
ECMAScript 3rd Edition (ECMA-262)
The definition of 'The instanceof operator' in that specification.
Standard Initial definition. Implemented in JavaScript 1.4.

Podpora v prohlížečích

Update compatibility data on GitHub
DesktopMobileServer
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewChrome for AndroidEdge MobileFirefox for AndroidOpera for AndroidSafari on iOSSamsung InternetNode.js
instanceofChrome Full support YesEdge Full support YesFirefox Full support 1IE Full support YesOpera Full support YesSafari Full support YesWebView Android Full support YesChrome Android Full support YesEdge Mobile Full support YesFirefox Android Full support 4Opera Android Full support YesSafari iOS Full support YesSamsung Internet Android Full support Yesnodejs Full support Yes

Legend

Full support  
Full support

Podívejte se také na

Štítky a přispěvatelé do dokumentace

Přispěvatelé této stránky: mdnwebdocs-bot, VelociraptorCZE
Poslední aktualizace od: mdnwebdocs-bot,