2015-03-08 11 views
32

Jeśli w klasie ES6 utworzę klasę i utworzę obiekt tej klasy, w jaki sposób mogę sprawdzić, czy obiekt jest tą klasą?W ES6, jak sprawdzić klasę obiektu?

Nie mogę po prostu użyć typeof, ponieważ obiekty są nadal "object". Czy po prostu porównuję konstruktorów?

Przykład:

class Person { 
    constructor() {} 
} 

var person = new Person(); 

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

Odpowiedz

47

nie można zrobić person instanceof Person?

Porównując konstruktorów sam nie będzie pracować dla podklasy

+0

Yup, zupełnie o tym zapomniałem! Działa tak, jak w przypadku funkcji (ponieważ klasy są po prostu funkcjami!). Dzięki! – Ivan

+1

To nie jest poprawna odpowiedź. jeśli masz klasy A, B, C i B & C rozszerza A, to (nowe B()) instanceof C zwraca wartość true. – someUser

+1

@someUser: 'nowy B() instanceof A' jest najrozsądniejszą definicją dziedziczenia w javascript. Jeśli stwierdzasz, że dostajesz to dla 'B' i' C', to twój problem polega na tym, że faktycznie 'B' odziedziczyłeś po' C', kiedy nie masz na to ochoty. W jaki sposób wdrażasz swoje dziedzictwo? – Eric

6

tylko słowo ostrzeżenia, użycie instanceof wydaje podatne na uszkodzenia dla literałów wbudowanych klas JS (np String, Number, etc). W takich przypadkach może być bezpieczniejsze w użyciu typeof następująco:

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

Patrz this thread aby uzyskać więcej informacji.

+0

Możesz dodać podwójną walidację – daronwolff

-4

w przypadku ECMAScript-6 klas dziedziczenia: powiedzmy, że klasa A jest bazą dla B i C, wówczas ani instanceof ani typeof będzie działać poprawnie, jak

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

zwróci true. W tym przypadku, robie:

(new B()).constructor == B 

Edycja: instanceof pracuje dla wymienionej sprawie, jak również, mój przykładowy kod miał problem.

+1

To w ogóle nie pasuje. Jeśli masz silnik ES6, który zwrócił to, a następnie prześlij błąd autorowi. Właśnie próbuje to w Chrome: klasy A {} _class odpowiedzi {} _ klasa B rozszerza {} _class B rozszerza {} _ klasa C rozszerza {} _class C rozszerza {} _ (nowy B()) instanceof C _false_ (nowy B()) instanceof A _true_ – Arkain

+0

mój zły, próbka była niepoprawna. – someUser

Powiązane problemy