2015-03-08 6 views
32

In der ES6, wenn ich eine Klasse erstellen und ein Objekt dieser Klasse erstellen, wie überprüfe ich, ob das Objekt diese Klasse ist?In ES6, wie überprüfen Sie die Klasse eines Objekts?

Ich kann nicht einfach typeof verwenden, weil die Objekte immer noch "object" sind. Vergleiche ich nur Konstruktoren?

Beispiel:

class Person { 
    constructor() {} 
} 

var person = new Person(); 

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

Antwort

47

Können Sie nicht person instanceof Person tun?

Konstrukteurs allein Vergleich wird für Subklassen nicht funktionieren

+0

Yup, völlig vergessen, dass! Es funktioniert genauso wie mit Funktionen (weil die Klassen nur Funktionen sind!). Vielen Dank! – Ivan

+1

das ist nicht die richtige Antwort. Wenn Sie A-, B- und C-Klassen haben und B & C A erweitert, dann liefert (neue B()) -Instanz von C den Wert true. – someUser

+1

@someUser: 'neue B() instanceof A' ist die vernünftigste Definition der Vererbung in Javascript. Wenn Sie feststellen, dass Sie das für "B" und "C" bekommen, dann ist Ihr Problem, dass Sie tatsächlich "B" von "C" erben ließen, wenn Sie nicht vorhatten. Wie implementieren Sie Ihre Erbschaft? – Eric

6

Nur ein Wort der Vorsicht, scheint die Verwendung von instanceof störanfällig für Literale von Einbau-JS-Klassen (z String, Number, etc). In diesen Fällen kann es sicherer sein typeof wie folgt zu verwenden:

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

für weitere Informationen zu this thread finden.

+0

Sie könnten doppelte Validierung hinzufügen – daronwolff

-4

bei ECMAScript-6 Vererbungsklassen: Ermöglicht Basisklasse A ist für B und C sagen, dann wird weder Instanceof noch typeof korrekt funktionieren, wie

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

wird true zurück. Für diesen Fall tue ich:

(new B()).constructor == B 

bearbeiten: instanceof als auch für genannten Fall arbeitet, hatte mein Beispielcode Problem.

+1

Das ist überhaupt nicht richtig. Wenn Sie eine ES6-Engine zurückgeben, senden Sie einen Fehler an den Autor. Ich habe gerade versucht dies in Chrome: Klasse A {} _class A {} _ Klasse B erstreckt A {} _class B erstreckt A {} _ Klasse C A erstreckt {} _class C erstreckt A {} _ (neue B()) instanceof _false_ (neue B()) instanceof _true_ – Arkain

+0

meine schlechte, die Probe war falsch. – someUser