2015-03-08 23 views
32

In ES6, se creo una classe e creo un oggetto di quella classe, come faccio a verificare che l'oggetto sia quella classe?In ES6, come si controlla la classe di un oggetto?

Non riesco a utilizzare solo typeof perché gli oggetti sono ancora "object". Devo solo confrontare i costruttori?

Esempio:

class Person { 
    constructor() {} 
} 

var person = new Person(); 

if (/* what do I put here to check if person is a Person? */) { 
    // do stuff 
} 

risposta

47

Non puoi fare person instanceof Person?

Confrontando i costruttori da solo non funziona per le sottoclassi

+0

Yup, completamente dimenticato! Funziona proprio come farebbe con le funzioni (perché le classi sono solo funzioni!). Grazie! – Ivan

+1

questa non è la risposta corretta. se hai classi A, B, C e B & C estende A, allora (nuova B()) instanceof C restituisce true. – someUser

+1

@someUser: 'new B() instanceof A' è la definizione più ragionevole di ereditarietà in javascript. Se stai scoprendo che lo ottieni per 'B' e' C', allora il tuo problema è che hai effettivamente fatto ereditare 'B' da' C' quando non lo avevi intenzione di fare. Come stai implementando la tua eredità? – Eric

6

Solo una parola di cautela, l'uso di instanceof sembra incline al fallimento per letterali di classi incorporate JS (ad esempio String, Number, ecc). In questi casi potrebbe essere più sicuro utilizzare typeof come segue:

typeof("foo") === "string";

Fare riferimento alla this thread per maggiori informazioni.

+0

È possibile aggiungere la doppia convalida – daronwolff

-4

in caso di ECMAScript-6 classi ereditarietà: Diciamo classe A è la base per B e C, quindi né instanceof né typeof funziona correttamente, come

(new B()) instanceof C // is true 

restituisce true. Per questo caso, sto facendo:

(new B()).constructor == B 

Edit: instanceof lavora per caso menzionato pure, il mio codice di esempio ha avuto problema.

+1

Non è affatto corretto. Se hai un motore ES6 che lo restituisce, invia un bug all'autore. Ho appena provato questo in Chrome: class A {} _class A {} _ di classe B estende A {} _class B estende A {} _ Classe C si estende A {} _class C si estende A {} _ (nuova B()) istanza di C _false_ (nuova B()) istanza di A _true_ – Arkain

+0

mio male, il campione non era corretto. – someUser

Problemi correlati