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 .

4voto

Ahmed Rahmi Punkte 75

getClass() Funktion über constructor.prototype.name

Ich habe einen Weg gefunden, auf die class die viel sauberer ist als einige der obigen Lösungen; hier ist sie.

function getClass(obj) {

   // if the type is not an object return the type
   if((let type = typeof obj) !== 'object') return type; 

   //otherwise, access the class using obj.constructor.name
   else return obj.constructor.name;   
}

Wie es funktioniert

hat der Konstruktor eine Eigenschaft namens name zugreifen, um den Klassennamen zu erhalten.

sauberere Version des Codes:

function getClass(obj) {

   // if the type is not an object return the type
   let type = typeof obj
   if((type !== 'object')) { 
      return type; 
   } else { //otherwise, access the class using obj.constructor.name
      return obj.constructor.name; 
   }   
}

2voto

zzy7186 Punkte 61

Ich finde object.constructor.toString() return [object objectClass] im IE, anstatt function objectClass () {} in Chome zurück. Ich denke also, dass der Code in http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects funktioniert möglicherweise nicht gut im IE, und ich habe den Code wie folgt geändert:

Code:

var getObjectClass = function (obj) {
        if (obj && obj.constructor && obj.constructor.toString()) {

                /*
                 *  for browsers which have name property in the constructor
                 *  of the object,such as chrome 
                 */
                if(obj.constructor.name) {
                    return obj.constructor.name;
                }
                var str = obj.constructor.toString();
                /*
                 * executed if the return of object.constructor.toString() is 
                 * "[object objectClass]"
                 */

                if(str.charAt(0) == '[')
                {
                        var arr = str.match(/\[\w+\s*(\w+)\]/);
                } else {
                        /*
                         * executed if the return of object.constructor.toString() is 
                         * "function objectClass () {}"
                         * for IE Firefox
                         */
                        var arr = str.match(/function\s*(\w+)/);
                }
                if (arr && arr.length == 2) {
                            return arr[1];
                        }
          }
          return undefined; 
    };

2voto

Jikhan Punkte 124

In javascript gibt es keine Klassen, aber ich denke, dass Sie den Konstruktornamen und obj.constructor.toString() wird Ihnen sagen, was Sie brauchen.

1voto

Bruno Finger Punkte 1449

Hier ist eine Implementierung von getClass() y getInstance()

Sie können eine Referenz für die Klasse eines Objekts erhalten, indem Sie this.constructor .

Aus einem Instanzkontext heraus:

function A() {
  this.getClass = function() {
    return this.constructor;
  }

  this.getNewInstance = function() {
    return new this.constructor;
  }
}

var a = new A();
console.log(a.getClass());  //  function A { // etc... }

// you can even:
var b = new (a.getClass());
console.log(b instanceof A); // true
var c = a.getNewInstance();
console.log(c instanceof A); // true

Aus statischem Zusammenhang:

function A() {};

A.getClass = function() {
  return this;
}

A.getInstance() {
  return new this;
}

1voto

Antkhan Punkte 27

Zustimmen mit dfa, das ist, warum ich den Prototye als die Klasse betrachten, wenn keine benannte Klasse gefunden

Hier ist eine verbesserte Funktion der von Eli Grey geposteten Funktion, die meiner Denkweise entspricht

function what(obj){
    if(typeof(obj)==="undefined")return "undefined";
    if(obj===null)return "Null";
    var res = Object.prototype.toString.call(obj).match(/^\[object\s(.*)\]$/)[1];
    if(res==="Object"){
        res = obj.constructor.name;
        if(typeof(res)!='string' || res.length==0){
            if(obj instanceof jQuery)return "jQuery";// jQuery build stranges Objects
            if(obj instanceof Array)return "Array";// Array prototype is very sneaky
            return "Object";
        }
    }
    return res;
}

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