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 .

16voto

Christian C. Salvadó Punkte 763569

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

12voto

mtizziani Punkte 828

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"

9voto

james_womack Punkte 9740

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.

6voto

Hugheth Punkte 1494

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... );

5voto

Alexey Nikonov Punkte 3530

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.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