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