1088 Stimmen

Wie erhält man die Klasse eines JavaScript-Objekts?

Ich habe ein JavaScript-Objekt erstellt, aber wie kann ich die Klasse dieses Objekts bestimmen?

Ich möchte etwas ähnliches wie Java's .getClass() Methode.

15 Stimmen

Wenn ich zum Beispiel eine Person wie folgt erstelle: var p = new Person(); Ich habe ein Person-Objekt mit dem Namen "p", wie kann ich "p" verwenden, um den Klassennamen "Person" zurückzubekommen.

8 Stimmen

0 Stimmen

Update: Seit ECMAScript 6 hat JavaScript immer noch keine class Typ. Sie tut haben eine class Schlüsselwort und class Syntax zur Erstellung von Prototypen, auf die die Methoden leichter zugreifen können super .

1432voto

earl Punkte 37791

Es gibt kein genaues Gegenstück zu Javas [getClass()](http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#getClass()) in JavaScript. Das liegt vor allem daran, dass JavaScript ein prototypische Sprache im Gegensatz zu Java, das eine klassenbasiert ein.

Je nachdem, was Sie brauchen getClass() für gibt es in JavaScript mehrere Möglichkeiten:

Hier ein paar Beispiele:

function Foo() {}
var foo = new Foo();

typeof Foo;             // == "function"
typeof foo;             // == "object"

foo instanceof Foo;     // == true
foo.constructor.name;   // == "Foo"
Foo.name                // == "Foo"    

Foo.prototype.isPrototypeOf(foo);   // == true

Foo.prototype.bar = function (x) {return x+x;};
foo.bar(21);            // == 42

Hinweis: Wenn Sie Ihren Code mit Uglify kompilieren, werden nicht-globale Klassennamen geändert. Um dies zu verhindern, hat Uglify eine --mangle Parameter, den Sie auf false setzen können, ist mit schlucken o Grunzen .

451voto

devios1 Punkte 35203
obj.constructor.name

ist in modernen Browsern eine zuverlässige Methode. Function.name wurde in ES6 offiziell in den Standard aufgenommen, so dass dies ein standardkonformes Mittel ist, um die "Klasse" eines JavaScript-Objekts als String zu erhalten. Wenn das Objekt instanziiert wird mit var obj = new MyClass() wird "MyClass" zurückgegeben.

Sie gibt "Number" für Zahlen, "Array" für Arrays und "Function" für Funktionen usw. zurück. Im Allgemeinen verhält es sich wie erwartet. Die einzigen Fälle, in denen es fehlschlägt, sind, wenn ein Objekt ohne Prototyp erstellt wird, über Object.create( null ) oder das Objekt wurde aus einer anonym definierten (unbenannten) Funktion instanziiert.

Beachten Sie auch, dass es nicht sicher ist, gegen hart kodierte Typ-Strings zu vergleichen, wenn Sie Ihren Code minimieren. Anstatt zum Beispiel zu prüfen, ob obj.constructor.name == "MyType" überprüfen Sie stattdessen obj.constructor.name == MyType.name . Oder vergleichen Sie einfach die Konstruktoren selbst, jedoch wird dies nicht über DOM-Grenzen hinweg funktionieren, da es verschiedene Instanzen der Konstruktorfunktion auf jedem DOM gibt, so dass ein Objektvergleich auf ihre Konstruktoren nicht funktionieren wird.

42voto

Eli Grey Punkte 34008

Diese Funktion getNativeClass() gibt zurück "undefined" für undefinierte Werte und "null" für Null.
Für alle anderen Werte wird die CLASSNAME -Teil wird entnommen aus [object CLASSNAME] was das Ergebnis der Verwendung von Object.prototype.toString.call(value) .

getAnyClass() verhält sich genauso wie getNativeClass(), unterstützt aber auch eigene Konstruktoren

function getNativeClass(obj) {
  if (typeof obj === "undefined") return "undefined";
  if (obj === null) return "null";
  return Object.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1];
}

function getAnyClass(obj) {
  if (typeof obj === "undefined") return "undefined";
  if (obj === null) return "null";
  return obj.constructor.name;
}

getClass("")   === "String";
getClass(true) === "Boolean";
getClass(0)    === "Number";
getClass([])   === "Array";
getClass({})   === "Object";
getClass(null) === "null";

getAnyClass(new (function Foo(){})) === "Foo";
getAnyClass(new class Foo{}) === "Foo";

// etc...

34voto

Maksym Dudyk Punkte 405

Wir können den Klassennamen einer Instanz lesen, indem wir einfach 'instance.constructor.name' wie in diesem Beispiel eingeben:

class Person {
  type = "developer";
}
let p = new Person();

p.constructor.name // Person

22voto

nonopolarity Punkte 138211

Um die "Pseudoklasse" zu erhalten, können Sie die Konstruktorfunktion erhalten, indem Sie

obj.constructor

unter der Annahme, dass die constructor richtig eingestellt ist, wenn Sie die Vererbung durchführen - also etwa so:

Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;

und diese beiden Zeilen, zusammen mit:

var woofie = new Dog()

wird machen woofie.constructor zeigen auf Dog . Beachten Sie, dass Dog ist eine Konstruktorfunktion, und ist eine Function Objekt. Aber Sie können if (woofie.constructor === Dog) { ... } .

Wenn Sie den Klassennamen als Zeichenkette abrufen möchten, funktioniert das Folgende gut:

http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects

function getObjectClass(obj) {
    if (obj && obj.constructor && obj.constructor.toString) {
        var arr = obj.constructor.toString().match(
            /function\s*(\w+)/);

        if (arr && arr.length == 2) {
            return arr[1];
        }
    }

    return undefined;
}

Sie ruft die Konstruktorfunktion auf, konvertiert sie in einen String und extrahiert den Namen der Konstruktorfunktion.

Beachten Sie, dass obj.constructor.name hätte gut funktionieren können, aber es ist nicht Standard. Es ist auf Chrome und Firefox, aber nicht auf IE, einschließlich IE 9 oder IE 10 RTM.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X