Как получить класс объекта JavaScript?

Я создал объект JavaScript, но как я могу определить класс объекта?

Я хочу что-то похожее на Java .getClass() метод.

14 ответов


нет точного аналога Java getClass() в JavaScript. В основном это связано с тем, что JavaScript является прототип на основе языка, в отличие от Java являясь класса один.

в зависимости от того, что вам нужно getClass() для, Есть несколько вариантов в JavaScript:

несколько примеров:

function Foo() {}
var foo = new Foo();

typeof Foo;             // == "function"
typeof foo;             // == "object"

foo instanceof Foo;     // == true
foo.constructor.name;   // == "Foo"
Foo.name                // == "Foo"    

Foo.prototype.isPrototypeOf(foo);   // == true

Foo.prototype.bar = function (x) {return x+x;};
foo.bar(21);            // == 42

Примечание: Если вы компилируете свой код с помощью Uglify, он изменит неглобальные имена классов. Чтобы предотвратить это, Uglify имеет --mangle param, который вы можете установить в false использует залпом или грунт.


obj.constructor.name

работает в большинстве случаев в современных браузерах, несмотря на Function.name официально не добавляется к стандарту до ES6. Если объект создается с помощью var obj = new MyClass(), он вернет "MyClass" в виде строки.

он вернет " число "для чисел," массив "для массивов и" функция " для функций и т. д. Это кажется вполне надежным. Единственные случаи, когда он терпит неудачу, - это если объект создается без прототипа, через Object.create( null ), или объект был создан из анонимно определенная (неназванная) функция.

возможно, obj.constructor.name гораздо более интуитивно, чем typeof, и может быть инкапсулирован в функцию для обработки нечетного случая, когда constructor не определен (и обрабатывать null ссылки).

Примечание: Другим преимуществом этого метода является то, что он работает интуитивно через границы DOM по сравнению с непосредственным сравнением объектов конструктора или использованием instanceOf. Причина, которая не работает, как вы могли бы ожидать, есть на самом деле разные экземпляры функции конструктора на каждом DOM, таким образом, сравнение объектов на их конструкторах не будет работать.

примечание 2: как ни странно, этот метод, похоже, возвращает имя базовой функции, используемой в цепочке прототипов,что, к сожалению, не интуитивно. Например, если B прототипически происходит от A и вы создаете новый экземпляр B, b, b.constructor.name возвращает "A"! Так что это кажется совершенно обратным. Он однако отлично работает для одноуровневых прототипов и всех примитивов.


эта функция возвращает либо "undefined", "null" или "class" на [object class] С Object.prototype.toString.call(someObject).

function getClass(obj) {
  if (typeof obj === "undefined")
    return "undefined";
  if (obj === null)
    return "null";
  return Object.prototype.toString.call(obj)
    .match(/^\[object\s(.*)\]$/)[1];
}

getClass("")   === "String";
getClass(true) === "Boolean";
getClass(0)    === "Number";
getClass([])   === "Array";
getClass({})   === "Object";
getClass(null) === "null";
// etc...

чтобы получить "псевдо-класс", вы можете получить функцию конструктора, по

obj.constructor

предполагая, что constructor устанавливается правильно, когда вы делаете наследование - что-то вроде:

Dog.prototype = new Animal();
Dog.prototype.constructor = Dog;

и эти две строки вместе с:

var woofie = new Dog()

сделает woofie.constructor выберите пункт Dog. Обратите внимание, что Dog является функцией конструктора и является


вы можете получить ссылку на функцию конструктора, которая создала объект, используя конструктор собственность:

function MyObject(){
}

var obj = new MyObject();
obj.constructor; // MyObject

Если вам нужно подтвердить тип объекта во время выполнения, вы можете использовать instanceof оператор:

obj instanceof MyObject // true

у меня была ситуация для работы generic сейчас и использовал это:

class Test {
  // your class definition
}

nameByType = function(type){
  return type.prototype["constructor"]["name"];
};

console.log(nameByType(Test));

это единственный способ получить имя класса по типу ввода, если у вас нет экземпляра объекта.

(написано на ES2017)

точечная нотация также отлично работает

console.log(Test.prototype.constructor.name); // returns "Test" 

найти object.constructor.toString() return [object objectClass] в IE ,а не function objectClass () {} вернулся в Хоме. Итак, я думаю, что код вhttp://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects может не работать хорошо в IE.И я исправил код следующим образом:

код:

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; 
    };

для классов Javascript в ES6 вы можете использовать object.constructor. В примере класса ниже getClass() метод возвращает класс ES6, как и следовало ожидать:

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!"

если вы создаете экземпляр класса из getClass метод убедитесь, что вы оберните его в скобки, например ruffles = new ( fluffy.getClass() )( args... );


в javascript нет классов, но я думаю, что вы хотите имя конструктора и obj.constructor.toString() скажу вам, что вам нужно.


в соответствии с его непрерывной записью обратной совместимости, ECMAScript 6, JavaScript по-прежнему не имеет class тип (хотя не все это понимают). Это тут есть class ключевое слово как часть его class синтаксис для создания прототипов, но до сих пор не называется класс. JavaScript не сейчас и имеет никогда не был классическим языком ООП. Говоря о JS с точки зрения класса, это только вводит в заблуждение или признак еще не нашарили прототипное наследование (просто держать его реальной).

что означает this.constructor по-прежнему отличный способ получить ссылку на


согласен с dfa, поэтому я рассматриваю prototye как класс, когда не найден именованный класс

вот обновленная функция того, который разместил Эли Грей, чтобы соответствовать моему образу мышления

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;
}

Javascript-это языки без классов: нет классов, которые определяют поведение класса статически, как в Java. JavaScript использует прототипы вместо классов для определения свойств объекта, включая методы и наследование. Можно имитировать многие функции на основе классов с прототипами в JavaScript.


вот реализация getClass() и getInstance()

вы можете получить ссылку на класс объекта, используя window.

из контекста примеру:

function A() {
    this.getClass = function() {
        return window[this.constructor.name];
    }

    this.getNewInstance = function() {
        return new window[this.constructor.name];
    }
}

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

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

из статического контекста:

function B() {};

B.getClass = function() {
    return window[this.name];
}

B.getInstance() {
    return new window[this.name];
}

вопрос, кажется, уже ответил, но OP хочет получить доступ к классу и объекту, так же, как мы делаем в Java, и выбранного ответа недостаточно (imho).

со следующим объяснением мы можем получить класс объекта (на самом деле он называется prototype в javascript).

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

вы можете добавить такое свойство:

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

но .last свойство будет доступно только для'arr' объект, который создается из прототипа массива. Итак, чтобы иметь .last свойство чтобы быть доступным для всех объектов, созданных из прототипа массива, мы должны определить .last свойство для прототипа массива:

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

проблема здесь в том, что вы должны знать, какой тип объекта (прототип)'arr' и ' принадлежит! Другими словами, если вы не знаете тип класса (прототипа)'', то вы не сможете определить свойство для них. В приведенном выше примере, мы знаем, что arr-это экземпляр объекта Array, поэтому мы использовали массив.прототип для определения свойства массива. Но что, если бы мы не знали класс (прототип)'arr'?

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

как вы можете видеть, не зная этого'arr' является массивом, мы можем добавить новое свойство просто bu ссылаясь на класс'arr' С помощью 'arr.__proto__'.

мы получили доступ к прототипу'arr ' не зная, что это экземпляр массива, и я думаю, что это то, что OP спросил.