Этот код получит имя конструктора, если он не является анонимной функцией:
obj.constructor.toString().match(/function (\w*)/)[1];
Зачем вам нужно имя класса? Допустим, вы хотите сохранить и восстановить экземпляры классов через JSON. Вы можете сохранить имя класса в свойстве type, а затем использовать функцию распознавателя в JSON.parse для восстановления объектов. (См. Пример кода на этой странице ).
Итак, теоретически вы могли бы использовать приведенный выше код для создания обобщенного сериализатора, который мог бы обрабатывать любой экземпляр класса, но разбор строк функций очень неэффективен. Этого можно избежать, требуя, чтобы все классы, которые вы собираетесь хранить, явно указывали тип:
function Foo() {}
Foo.prototype.type = 'Foo';
Это кажется глупым и излишним, поэтому я начал поиски неявного имени класса. Но в конце я должен согласиться: в JS нет приемлемого решения: - (