Ich habe ein JavaScript-Objekt erstellt, aber wie kann ich die Klasse dieses Objekts bestimmen?
Ich möchte etwas Ähnliches wie Javas .getClass()
Methode.
javascript
oop
DNB5brims
quelle
quelle
class
Typ. Es verfügt über einclass
Schlüsselwort und eineclass
Syntax zum Erstellen von Prototypen, auf die die Methoden leichter zugreifen könnensuper
.Antworten:
Es gibt kein genaues Gegenstück zu Java
getClass()
in JavaScript. Dies liegt hauptsächlich daran, dass JavaScript eine prototypbasierte Sprache ist , im Gegensatz zu Java eine klassenbasierte Sprache .Je nachdem, was Sie benötigen
getClass()
, gibt es in JavaScript verschiedene Optionen:typeof
instanceof
obj.
constructor
func.
prototype
,proto
.isPrototypeOf
Einige Beispiele:
Hinweis: Wenn Sie Ihren Code mit Uglify kompilieren, werden nicht globale Klassennamen geändert. Um dies zu verhindern, hat Uglify einen
--mangle
Parameter, den Sie auf false setzen können, indem Sie gulp oder grunt verwenden .quelle
func.prototype
(ja, Funktionen sind Objekte, aber dieprototype
Eigenschaft ist nur für Funktionsobjekte relevant).instanceof
/isPrototypeOf()
und den Nicht-Standard erwähnen__proto__
Object.getPrototypeOf()
constructor.name
Verlassen Sie sich nicht darauf, ob Ihr Code minimiert wird. Der Funktionsname wird sich willkürlich ändern.construction.name
als Token erkannt , das ignoriert / nicht minimiert werden muss. Außerdem bieten die meisten (wenn nicht alle) Minifier-Programme Ausnahmeregeln.ist eine zuverlässige Methode in modernen Browsern.
Function.name
wurde offiziell zum Standard in ES6 hinzugefügt, wodurch dies ein standardkonformes Mittel ist, um die "Klasse" eines JavaScript-Objekts als Zeichenfolge abzurufen. Wenn das Objekt mit instanziiert wirdvar obj = new MyClass()
, gibt es "MyClass" zurück.Es wird "Number" für Zahlen, "Array" für Arrays und "Function" für Funktionen usw. zurückgegeben. Es verhält sich im Allgemeinen wie erwartet. Die einzigen Fälle, in denen dies fehlschlägt, sind, wenn ein Objekt ohne Prototyp über erstellt
Object.create( null )
wird oder das Objekt über eine anonym definierte (unbenannte) Funktion instanziiert wurde.Beachten Sie außerdem, dass beim Minimieren Ihres Codes ein Vergleich mit fest codierten Zeichenfolgen nicht sicher ist. Zum Beispiel anstatt zu prüfen, ob
obj.constructor.name == "MyType"
, sondern zu prüfenobj.constructor.name == MyType.name
. Oder vergleichen Sie einfach die Konstruktoren selbst. Dies funktioniert jedoch nicht über DOM-Grenzen hinweg, da in jedem DOM unterschiedliche Instanzen der Konstruktorfunktion vorhanden sind. Daher funktioniert ein Objektvergleich für ihre Konstruktoren nicht.quelle
Function.name
ist (noch) nicht Teil des JavaScript-Standards. Es wird derzeit in Chrome und Firefox unterstützt, jedoch nicht in IE (10).obj.constructor.name
funktioniert nur für benannte Funktionen. Das heißt, wenn ich definierenvar Foo = function() {}
, dannvar foo = new Foo()
,foo.constructor.name
werden Sie leere Zeichenfolge geben.constructor.name
Verlassen Sie sich nicht darauf, ob Ihr Code minimiert wird. Der Funktionsname wird sich willkürlich ändern.constructor.name
sich die neue Klassenunterstützung in ES6 wie erwartet verhält.Diese Funktion gibt
"Undefined"
für undefinierte Werte und"Null"
für null zurück.Für alle anderen Werte wird der
CLASSNAME
-part extrahiert[object CLASSNAME]
, was das Ergebnis der Verwendung istObject.prototype.toString.call(value)
.quelle
"Object"
.return obj.constructor.name
. Dies führt zu denselben Ergebnissen und behandelt auch nicht native Objekte.Um die "Pseudoklasse" zu erhalten, können Sie die Konstruktorfunktion von abrufen
Angenommen, das
constructor
ist richtig eingestellt, wenn Sie die Vererbung durchführen - was ungefähr so aussieht:und diese beiden Zeilen zusammen mit:
wird darauf
woofie.constructor
hinweisenDog
. Beachten Sie, dassDog
eine Konstruktorfunktion und einFunction
Objekt ist. Aber du kannst es tunif (woofie.constructor === Dog) { ... }
.Wenn Sie den Klassennamen als Zeichenfolge erhalten möchten, hat Folgendes gut funktioniert:
http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects
Es gelangt zur Konstruktorfunktion, konvertiert sie in eine Zeichenfolge und extrahiert den Namen der Konstruktorfunktion.
Beachten Sie, dass
obj.constructor.name
dies gut hätte 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.quelle
Mithilfe der Konstruktoreigenschaft können Sie einen Verweis auf die Konstruktorfunktion abrufen, mit der das Objekt erstellt wurde :
Wenn Sie den Typ eines Objekts zur Laufzeit bestätigen müssen, können Sie den Operator instanceof verwenden :
quelle
Entsprechend der ununterbrochenen Aufzeichnung der Abwärtskompatibilität, ECMAScript 6, hat JavaScript immer noch keinen
class
Typ (obwohl dies nicht jeder versteht). Es hat einclass
Schlüsselwort als Teil seinerclass
Syntax zum Erstellen von Prototypen - aber immer noch nichts, was als Klasse bezeichnet wird . JavaScript ist nicht jetzt und war noch nie eine klassische OOP-Sprache . Von JS in Bezug auf die Klasse zu sprechen, ist nur entweder irreführend oder ein Zeichen dafür, dass die prototypische Vererbung noch nicht gescheitert ist (nur um sie real zu halten).Das heißt, es
this.constructor
ist immer noch eine gute Möglichkeit, einen Verweis auf dieconstructor
Funktion zu erhalten. Undthis.constructor.prototype
ist der Weg, um auf den Prototyp selbst zuzugreifen. Da dies kein Java ist, ist es keine Klasse. Dies ist das Prototypobjekt, von dem aus Ihre Instanz instanziiert wurde. Hier ist ein Beispiel für die Verwendung des syntaktischen ES6-Zuckers zum Erstellen einer Prototypkette:Dies wird ausgegeben mit
babel-node
:Hier hast du es! Im Jahr 2016 gibt es ein
class
Schlüsselwort in JavaScript, aber immer noch keinen Klassentyp.this.constructor
ist der beste Weg, um die Konstruktorfunktion zu erhalten,this.constructor.prototype
der beste Weg, um auf den Prototyp selbst zuzugreifen.quelle
Ich hatte eine Situation, um jetzt generisch zu arbeiten und benutzte diese:
Das ist die einzige Möglichkeit, den Klassennamen per Typeneingabe zu erhalten, wenn Sie keine Instanz eines Objekts haben.
(geschrieben in ES2017)
Die Punktnotation funktioniert auch gut
quelle
Für Javascript-Klassen in ES6 können Sie verwenden
object.constructor
. In der folgenden Beispielklasse gibt diegetClass()
Methode die ES6-Klasse wie erwartet zurück:Wenn Sie die Klasse über die
getClass
Methode instanziieren , stellen Sie sicher, dass Sie sie in Klammern setzen, zruffles = new ( fluffy.getClass() )( args... );
quelle
Ich finde
object.constructor.toString()
Rückkehr[object objectClass]
im IE, anstattfunction objectClass () {}
in chome zurückgegeben. Daher denke ich, dass der Code in http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects in IE möglicherweise nicht gut funktioniert. Und ich habe den Code wie folgt behoben:Code:
quelle
In Javascript gibt es keine Klassen, aber ich denke, Sie möchten den Konstruktornamen und
obj.constructor.toString()
werden Ihnen sagen, was Sie brauchen.quelle
.name
..name
nicht einmal auf IE 9 definiertStimmen Sie mit dfa überein, deshalb betrachte ich das Prototye als die Klasse, wenn keine benannte Klasse gefunden wird
Hier ist eine verbesserte Funktion der von Eli Gray geposteten, die meiner Einstellung entspricht
quelle
Wenn Sie die Klasse nicht nur GET, sondern auch von einer Instanz erweitern möchten, schreiben Sie:
Lass uns
Um A zu erweitern, wobei die Instanz nur Folgendes verwendet:
quelle
Ich schlage vor
Object.prototype.constructor.name
:quelle
Hier ist eine Implementierung von
getClass()
undgetInstance()
Mit können Sie eine Referenz für die Klasse eines Objekts abrufen
this.constructor
.Aus einem Instanzkontext:
Aus dem statischen Kontext:
quelle
this.constructor
?Sie können auch so etwas tun
Hier erfahren Sie, ob die Eingabe klasse ist oder nicht
quelle
Javascript ist eine klassenlose Sprache: Es gibt keine Klassen, die das Verhalten einer Klasse statisch wie in Java definieren. JavaScript verwendet Prototypen anstelle von Klassen zum Definieren von Objekteigenschaften, einschließlich Methoden und Vererbung. Es ist möglich, viele klassenbasierte Funktionen mit Prototypen in JavaScript zu simulieren.
quelle
class
Typ. Es verfügt über einclass
Schlüsselwort und eineclass
Syntax zum Erstellen von Prototypen, auf die die Methoden leichter zugreifen könnensuper
.Die Frage scheint bereits beantwortet zu sein, aber das OP möchte auf die Klasse und das Objekt zugreifen, genau wie wir es in Java tun, und die ausgewählte Antwort reicht nicht aus (imho).
Mit der folgenden Erklärung können wir eine Klasse eines Objekts erhalten (in Javascript heißt es tatsächlich Prototyp).
Sie können eine Eigenschaft wie folgt hinzufügen:
Die
.last
Eigenschaft ist jedoch nur fürarr
Objekte verfügbar, die vom Array-Prototyp instanziiert wurden. Damit die.last
Eigenschaft für alle vom Array-Prototyp instanziierten Objekte verfügbar ist, müssen wir die.last
Eigenschaft für den Array-Prototyp definieren:Das Problem hierbei ist, dass Sie wissen müssen, zu welchem Objekttyp (Prototyp) die Variablen '
arr
' und 'arr2
' gehören! Mit anderen Worten, wenn Sie den Klassentyp (Prototyp) desarr
Objekts ' ' nicht kennen , können Sie keine Eigenschaft für dieses Objekt definieren. Im obigen Beispiel wissen wir, dass arr eine Instanz des Array-Objekts ist. Deshalb haben wir Array.prototype verwendet, um eine Eigenschaft für Array zu definieren. Aber was wäre, wenn wir die Klasse (den Prototyp) des 'arr
' nicht kennen würden ?Wie Sie sehen können, können
arr
wir , ohne zu wissen, dass ' ' ein Array ist, eine neue Eigenschaft hinzufügen, indem wir nur die Klasse des 'arr
' mit 'arr.__proto__
' referenzieren.Wir haben auf den Prototyp des '
arr
' zugegriffen , ohne zu wissen, dass es sich um eine Instanz von Array handelt, und ich denke, das hat OP gefragt.quelle
__proto__
Immobilie ist veraltet und hat fast keinen Vorteil gegenüber derprototype
Immobilie.