obj.constructor.name
- надежный метод в современных браузерах. Function.name
был официально добавлен к стандарту в ES6, что делает его совместимым со стандартами средством получения «класса» объекта JavaScript в виде строки. Если объект создан с var obj = new MyClass()
, он вернет «MyClass».
Возвращает «Число» для чисел, «Массив» для массивов и «Функция» для функций и т. Д. Обычно оно работает так, как ожидается. Единственные случаи, когда он терпит неудачу, это если объект создается без прототипа, через Object.create( null )
, или объект был создан из анонимно определенной (неназванной) функции.
Также обратите внимание, что если вы минимизируете свой код, сравнивать строки с жестко запрограммированным типом небезопасно. Например, вместо проверки obj.constructor.name == "MyType"
, вместо проверки obj.constructor.name == MyType.name
. Или просто сравните сами конструкторы, однако это не сработает через границы DOM, так как в каждом DOM есть разные экземпляры функции конструктора, поэтому сравнение объектов для их конструкторов не будет работать.
Примечание при создании цепочки прототипов
Редактировать: Это, очевидно, спорный вопрос, теперь, когда ES6 имеет лучшую поддержку классов и наследования. Как объясняет adalbertpl, constructor.name
ведет себя так, как ожидалось в этом сценарии.
Как ни странно, constructor.name
возвращает имя самой базовой функции, используемой в цепочке прототипов, что, к сожалению, не интуитивно понятно. Например, если B
является прототипом A
и вы создаете новый экземпляр B
, b
, b.constructor.name
возвращает «A», что кажется неправильным. Однако он отлично работает для одноуровневых прототипов и всех примитивов.