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 .

1voto

iRohitBhatia Punkte 2979

Sie können auch wie folgt vorgehen

 class Hello {
     constructor(){
     }
    }

      function isClass (func) {
        return typeof func === 'function' && /^class\s/.test(Function.prototype.toString.call(func))
    }

   console.log(isClass(Hello))

So erfahren Sie, ob die Eingabe Klasse ist oder nicht

0voto

Sapphire_Brick Punkte 1352

Ich empfehle die Verwendung von Object.prototype.constructor.name :

Object.defineProperty(Object.prototype, "getClass", {
    value: function() {
      return this.constructor.name;
    }
});

var x = new DOMParser();
console.log(x.getClass()); // `DOMParser'

var y = new Error("");
console.log(y.getClass()); // `Error'

-2voto

dfa Punkte 110809

Javascript ist eine klassenlose Sprache: Es gibt keine Klassen, die das Verhalten einer Klasse statisch definieren wie in Java. JavaScript verwendet Prototypen anstelle von Klassen zur Definition von Objekteigenschaften, einschließlich Methoden und Vererbung. Es ist möglich, viele klassenbasierte Funktionen mit Prototypen in JavaScript zu simulieren.

-4voto

ramazan polat Punkte 5829

Die Frage scheint bereits beantwortet zu sein, aber der Fragesteller möchte auf die Klasse eines Objekts zugreifen, genau wie wir es in Java tun, und die ausgewählte Antwort ist nicht genug (imho).

Mit der folgenden Erklärung, können wir eine Klasse eines Objekts (es ist eigentlich genannt Prototyp in Javascript) zu erhalten.

var arr = new Array('red', 'green', 'blue');
var arr2 = new Array('white', 'black', 'orange');

Sie können eine Eigenschaft wie diese hinzufügen:

Object.defineProperty(arr,'last', {
  get: function(){
    return this[this.length -1];
  }
});
console.log(arr.last) // blue

Mais .last ist nur für die Eigenschaft ' arr Objekt, das aus dem Array-Prototyp instanziiert wird. Um also das .last Eigenschaft für alle aus dem Array-Prototyp instanziierten Objekte verfügbar sein soll, müssen wir die .last Eigenschaft für Array-Prototyp:

Object.defineProperty(Array.prototype,'last', {
  get: function(){
    return this[this.length -1];
  }
});
console.log(arr.last) // blue
console.log(arr2.last) // orange

Das Problem dabei ist, dass Sie wissen müssen, welchen Objekttyp (Prototyp) die ' arr ' und ' arr2 ' Variablen gehört! Mit anderen Worten: Wenn Sie den Klassentyp (Prototyp) der ' arr ' Objekt, dann können Sie keine Eigenschaft für sie definieren. Im obigen Beispiel wissen wir, dass arr eine Instanz des Array-Objekts ist, weshalb wir Array.prototype verwendet haben, um eine Eigenschaft für Array zu definieren. Aber was wäre, wenn wir die Klasse (den Prototyp) des Arrays nicht kennen würden? arr '?

Object.defineProperty(arr.__proto__,'last2', {
  get: function(){
    return this[this.length -1];
  }
});
console.log(arr.last) // blue
console.log(arr2.last) // orange

Wie Sie sehen können, ohne zu wissen, dass ' arr ' ein Array ist, können wir eine neue Eigenschaft hinzufügen, indem wir einfach auf die Klasse des ' arr ' durch Verwendung von ' arr.__proto__ '.

Wir haben den Prototyp des ' arr ', ohne zu wissen, dass es sich um eine Instanz von Array handelt, und ich denke, das ist es, was OP gefragt hat.

-4voto

Es gibt noch eine weitere Technik, um Ihre Klasse zu identifizieren Sie können den Verweis auf Ihre Klasse in einer Instanz wie unten speichern.

class MyClass {
    static myStaticProperty = 'default';
    constructor() {
        this.__class__ = new.target;
        this.showStaticProperty = function() {
            console.log(this.__class__.myStaticProperty);
        }
    }
}

class MyChildClass extends MyClass {
    static myStaticProperty = 'custom';
}

let myClass = new MyClass();
let child = new MyChildClass();

myClass.showStaticProperty(); // default
child.showStaticProperty(); // custom

myClass.__class__ === MyClass; // true
child.__class__ === MyClass; // false
child.__class__ === MyChildClass; // true

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