Update здесь является окончательным и рабочий код - только в том случае, если кто-то нашел, что это полезно: jsfiddleПолучить тип объекта
Я написал это как детектор типа. Он работает очень хорошо во всех случаях - насколько я тестировал, но не только в одном случае.
Во-первых, вот фрагмент кода: jsfiddle
var TypeOf = function (thing) {
var typeOfThing = typeof thing;
if (typeOfThing === 'object') {
typeOfThing = Object.prototype.toString.call(thing);
if (typeOfThing === '[object Object]') {
if (thing.constructor.name)
typeOfThing = thing.constructor.name;
else if (thing.constructor.toString().charAt(0) === '[')
typeOfThing = typeOfThing.substring(8,typeOfThing.length - 1);
else
typeOfThing = thing.constructor.toString().match(/function\s*(\w+)/)[1];
} else {
typeOfThing = typeOfThing.substring(8,typeOfThing.length - 1);
}
return typeOfThing.toLowerCase();
} else {
return typeOfThing;
}
}
Проблема заключается в том, что если я определить функцию в parse-time
тогда он будет работать прекрасно:
function me() {};
var you = new me();
console.log('Type of you: ' + TypeOf(you)); // me
Однако, если я просто определить его в run-time
, то это не сработает:
var me = function() {};
var you = new me();
console.log('Type of you: ' + TypeOf(you)); // nope
Насколько я могу видеть в случае синтаксического разбора constructor
что-то вроде function me() {}
, поэтому я могу получить его с /function\s*(\w+)/
, однако во время выполнения конструктор function() {}
.
Есть ли способ заставить это работать? А также есть ли другие случаи, когда этот фрагмент потенциально может не обнаружить тип?
Обновление как указано в комментариях, кажется, что я пытаюсь получить имя анонимной функции. Это выглядит немного страшно для меня. Возможно ли это?
Update, как @jackson сказано ниже, кажется, что правильный вывод должен быть function
не me
. Это действительно правильно?
Вы по существу спрашиваете, как получить имя анонимной функции. То есть, по определению, довольно сложно сделать. – lonesomeday
@lonesomeday Спасибо, ты прав, я постараюсь перефразировать заголовок вопроса. – Mahdi
Обратите также внимание, что вы можете делать 'thing.constructor.name' в браузерах, которые его поддерживают (! IE, в основном). Кстати, когда я говорю «довольно сложно сделать» выше, я на самом деле имею в виду «по определению невозможно». – lonesomeday