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.
Sie können einen Verweis auf die Konstruktorfunktion erhalten, die das Objekt erstellt hat, indem Sie die Konstrukteurseigenschaft :
function MyObject(){
}
var obj = new MyObject();
obj.constructor; // MyObject
Wenn Sie den Typ eines Objekts zur Laufzeit bestätigen müssen, können Sie die Funktion instanceof Betreiber:
obj instanceof MyObject // true
Ich hatte jetzt eine Situation, in der ich generisch arbeiten musste, und habe das hier benutzt:
class Test {
// your class definition
}
nameByType = function(type){
return type.prototype["constructor"]["name"];
};
console.log(nameByType(Test));
Das ist die einzige Möglichkeit, die ich gefunden habe, um den Klassennamen über die Typeingabe zu erhalten, wenn Sie keine Instanz eines Objekts haben.
(geschrieben in ES2017)
Die Punktnotation funktioniert auch gut
console.log(Test.prototype.constructor.name); // returns "Test"
Im Einklang mit der ungebrochenen Rückwärtskompatibilität von ECMAScript 6 hat JavaScript immer noch keine class
Typ (auch wenn das nicht jeder versteht). Es tut haben eine class
Schlüsselwort als Teil seiner class
Syntax für die Erstellung von Prototypen, aber immer noch keine Sache namens Klasse . JavaScript ist jetzt nicht und hat war nie eine klassische OOP-Sprache . Sprechen von JS in Bezug auf die Klasse ist nur entweder irreführend oder ein Zeichen für noch nicht grokking prototypische Vererbung (nur halten es real).
Das bedeutet this.constructor
ist immer noch ein guter Weg, um einen Verweis auf die constructor
Funktion. Und this.constructor.prototype
ist der Weg, um auf den Prototyp selbst zuzugreifen. Da es sich nicht um Java handelt, ist es keine Klasse. Es ist das Prototyp-Objekt, von dem Ihre Instanz instanziiert wurde. Hier ein Beispiel für die Verwendung des syntaktischen Zuckers ES6 zur Erstellung einer Prototypenkette:
class Foo {
get foo () {
console.info(this.constructor, this.constructor.name)
return 'foo'
}
}
class Bar extends Foo {
get foo () {
console.info('[THIS]', this.constructor, this.constructor.name, Object.getOwnPropertyNames(this.constructor.prototype))
console.info('[SUPER]', super.constructor, super.constructor.name, Object.getOwnPropertyNames(super.constructor.prototype))
return `${super.foo} + bar`
}
}
const bar = new Bar()
console.dir(bar.foo)
Dies ist die Ausgabe mit babel-node
:
> $ babel-node ./foo.js 6.2.0 [±master ]
[THIS] [Function: Bar] 'Bar' [ 'constructor', 'foo' ]
[SUPER] [Function: Foo] 'Foo' [ 'constructor', 'foo' ]
[Function: Bar] 'Bar'
'foo + bar'
Da haben Sie es! Im Jahr 2016 gibt es eine class
Schlüsselwort in JavaScript, aber immer noch kein Klassentyp. this.constructor
ist der beste Weg, um die Konstruktorfunktion zu erhalten, this.constructor.prototype
der beste Weg, um Zugang zum Prototyp selbst zu erhalten.
Für Javascript-Klassen in ES6 können Sie verwenden object.constructor
. In der folgenden Beispielklasse ist die getClass()
Methode gibt die ES6-Klasse zurück, wie Sie es erwarten würden:
var Cat = class {
meow() {
console.log("meow!");
}
getClass() {
return this.constructor;
}
}
var fluffy = new Cat();
...
var AlsoCat = fluffy.getClass();
var ruffles = new AlsoCat();
ruffles.meow(); // "meow!"
Wenn Sie die Klasse aus der Datei getClass
Methode ist darauf zu achten, dass sie in Klammern eingeschlossen wird, z. B. ruffles = new ( fluffy.getClass() )( args... );
Wenn Sie die Klasse nicht nur GET, sondern auch EXTEND benötigen, schreiben Sie:
lassen wir uns
class A{
constructor(name){
this.name = name
}
};
const a1 = new A('hello a1');
so zu erweitern A mit der Instanz nur verwenden:
const a2 = new (Object.getPrototypeOf(a1)).constructor('hello from a2')
// the analog of const a2 = new A()
console.log(a2.name)//'hello from a2'
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.