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.
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.
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:
typeof
instanceof
obj.
constructor
func.
prototype
, proto
. isPrototypeOf
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 .
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.
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...
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 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.
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
Duplizieren Sie
0 Stimmen
Update: Seit ECMAScript 6 hat JavaScript immer noch keine
class
Typ. Sie tut haben eineclass
Schlüsselwort undclass
Syntax zur Erstellung von Prototypen, auf die die Methoden leichter zugreifen könnensuper
.0 Stimmen
Was ist mit Object.className?
1 Stimmen
@Paul-Basenko : "className" sagt Ihnen nicht die Klasse des Objekts, sondern gibt den Inhalt der Eigenschaft "class" eines HTML-Elements zurück, die sich auf CSS-Klassen bezieht. Sie wollen auch "classList" verwenden, um sie einfach zu verwalten, aber das hat nichts mit der Frage des Autors zu tun.