Я создал объект JavaScript, но как я могу определить класс этого объекта?
Я хочу что-то похожее на .getClass()
метод Java .
javascript
oop
DNB5brims
источник
источник
class
типа. У него естьclass
ключевое слово иclass
синтаксис для создания прототипов, к которым методы могут получить более легкий доступsuper
.Ответы:
Там нет точного аналога Java
getClass()
в JavaScript. В основном это связано с тем, что JavaScript является языком на основе прототипов , а не Java классов .В зависимости от того, что вам нужно
getClass()
, в JavaScript есть несколько опций:typeof
instanceof
obj.
constructor
func.
prototype
,proto
.isPrototypeOf
Несколько примеров:
Примечание: если вы компилируете свой код с помощью Uglify, он изменит неглобальные имена классов. Чтобы предотвратить это, в Uglify есть
--mangle
параметр, который вы можете установить в false, используя gulp или grunt .источник
func.prototype
(да, функции являются объектами, ноprototype
свойство относится только к объектам функций).instanceof
/isPrototypeOf()
и нестандартные__proto__
Object.getPrototypeOf()
constructor.name
если ваш код минимизируется. Имя функции будет меняться произвольно.construction.name
как токены, которые следует игнорировать / не минимизировать. Кроме того, большинство (если не все) программы-минификаторы предоставляют правила исключений.это надежный метод в современных браузерах.
Function.name
был официально добавлен к стандарту в ES6, что делает его совместимым со стандартами средством получения «класса» объекта JavaScript в виде строки. Если объект создан с помощьюvar obj = new MyClass()
, он вернет «MyClass».Он вернет «Число» для чисел, «Массив» для массивов и «Функция» для функций и т. Д. Обычно он ведет себя как ожидалось. Единственные случаи, когда он терпит неудачу, это если объект создается без прототипа, с помощью
Object.create( null )
, или объект был создан из анонимно определенной (неназванной) функции.Также обратите внимание, что если вы минимизируете свой код, сравнивать его с жестко-закодированными строками типов небезопасно. Например, вместо проверки, если
obj.constructor.name == "MyType"
вместо проверкиobj.constructor.name == MyType.name
. Или просто сравните сами конструкторы, однако это не сработает через границы DOM, поскольку в каждом DOM есть разные экземпляры функции конструктора, поэтому сравнение объектов на их конструкторах не будет работать.источник
Function.name
не является (пока) частью стандарта JavaScript. В настоящее время он поддерживается в Chrome и Firefox, но не в IE (10).obj.constructor.name
работает только для именованных функций. То есть, если я определяюvar Foo = function() {}
, то дляvar foo = new Foo()
,foo.constructor.name
даст вам пустую строку.constructor.name
если ваш код минимизируется. Имя функции будет меняться произвольно.constructor.name
ведет себя как ожидалось с поддержкой нового класса в ES6.Эта функция возвращает
"Undefined"
неопределенные значения и"Null"
нулевое значение.Для всех других значений
CLASSNAME
извлекается -part из[object CLASSNAME]
, что является результатом использованияObject.prototype.toString.call(value)
.источник
"Object"
.return obj.constructor.name
. Это дает те же результаты, а также обрабатывает не собственные объекты.Чтобы получить «псевдокласс», вы можете получить функцию конструктора,
Предполагая, что
constructor
правильно установлен, когда вы делаете наследование - что-то вроде:и эти две строки вместе с:
будет
woofie.constructor
указывать наDog
. Обратите внимание, чтоDog
это функция конструктора иFunction
объект. Но вы можете сделатьif (woofie.constructor === Dog) { ... }
.Если вы хотите получить имя класса в виде строки, я обнаружил, что следующее работает хорошо:
http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects
Он попадает в функцию конструктора, преобразует ее в строку и извлекает имя функции конструктора.
Обратите внимание, что это
obj.constructor.name
могло бы хорошо сработать, но это не стандартно. Это на Chrome и Firefox, но не на IE, включая IE 9 или IE 10 RTM.источник
Вы можете получить ссылку на функцию конструктора, которая создала объект, используя свойство конструктора :
Если вам нужно подтвердить тип объекта во время выполнения, вы можете использовать оператор instanceof :
источник
В соответствии со своей непрерывной записью обратной совместимости, ECMAScript 6, JavaScript все еще не имеет
class
типа (хотя не все это понимают). У него естьclass
ключевое слово как часть егоclass
синтаксиса для создания прототипов, но по- прежнему ничего не называется класс . JavaScript не сейчас и имеет не был классическим языком ООП . Говоря о JS с точки зрения класса, это либо вводит в заблуждение, либо является признаком того, что еще не уклоняется от прототипного наследования (просто сохраняя его реальным).Это означает, что
this.constructor
это по-прежнему отличный способ получить ссылку наconstructor
функцию. Иthis.constructor.prototype
это способ получить доступ к самому прототипу. Поскольку это не Java, это не класс. Это объект-прототип, из которого был создан экземпляр. Вот пример использования синтаксического сахара ES6 для создания цепочки прототипов:Это то, что это выводит, используя
babel-node
:Вот оно! В 2016 году
class
в JavaScript есть ключевое слово, но все еще нет типа класса.this.constructor
это лучший способ получить функцию конструктора,this.constructor.prototype
лучший способ получить доступ к самому прототипу.источник
у меня была ситуация, чтобы работать сейчас общий и использовал это:
это единственный способ получить имя класса по типу ввода, если у вас нет экземпляра объекта.
(написано в ES2017)
Точечная запись также отлично работает
источник
Для классов Javascript в ES6 вы можете использовать
object.constructor
. В приведенном ниже примере классаgetClass()
метод возвращает класс ES6, как и следовало ожидать:Если вы создаете экземпляр класса из
getClass
метода, убедитесь, что вы заключили его в скобки, напримерruffles = new ( fluffy.getClass() )( args... );
источник
Я нахожу
object.constructor.toString()
возвращение[object objectClass]
в IE, а неfunction objectClass () {}
возвращение в chome. Итак, я думаю, что код в http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects может не работать в IE. И я исправил код следующим образом:код:
источник
В javascript нет классов, но я думаю, что вы хотите имя конструктора и
obj.constructor.toString()
скажете, что вам нужно.источник
.name
..name
не определено даже в IE 9Согласитесь с dfa, поэтому я рассматриваю прототип как класс, когда не найдено ни одного именованного класса
Вот обновленная функция, опубликованная Эли Греем, в соответствии с моим мнением
источник
Если вам нужно не только получить класс GET, но и расширить его, добавив только экземпляр, напишите:
Давайте
Таким образом, чтобы расширить A, используя только экземпляр:
источник
Я предлагаю использовать
Object.prototype.constructor.name
:источник
Вот реализация
getClass()
иgetInstance()
Вы можете получить ссылку на класс объекта, используя
this.constructor
.Из контекста экземпляра:
Из статического контекста:
источник
this.constructor
?Вы также можете сделать что-то вроде этого
Это скажет вам, если вход является классом или нет
источник
Javascript - это язык без классов: нет классов, которые бы определяли поведение класса статически, как в Java. JavaScript использует прототипы вместо классов для определения свойств объекта, включая методы и наследование. Можно моделировать многие функции классов на основе прототипов в JavaScript.
источник
class
типа. У него естьclass
ключевое слово иclass
синтаксис для создания прототипов, к которым методы могут получить более легкий доступsuper
.Кажется, вопрос уже получен, но ОП хочет получить доступ к классу и объекту, как мы делаем в Java, и выбранного ответа недостаточно (imho).
С помощью следующего объяснения мы можем получить класс объекта (на самом деле он называется прототипом в javascript).
Вы можете добавить свойство как это:
Но
.last
свойство будет доступно только дляarr
объекта, который создается из прототипа Array. Итак, чтобы.last
свойство было доступно для всех объектов, созданных из прототипа Array, мы должны определить.last
свойство для прототипа Array:Проблема в том, что вы должны знать, к какому типу объекта (прототипу) относятся переменные '
arr
' и 'arr2
'! Другими словами, если вы не знаете тип класса (прототип) объекта 'arr
', то вы не сможете определить свойство для них. В приведенном выше примере мы знаем, что arr является экземпляром объекта Array, поэтому мы использовали Array.prototype, чтобы определить свойство для Array. Но что, если мы не знали класс (прототип) 'arr
'?Как видите, не зная, что '
arr
' является массивом, мы можем добавить новое свойство, просто ссылаясь на класс 'arr
' с помощью 'arr.__proto__
'.Мы получили доступ к прототипу '
arr
', не зная, что это экземпляр Array, и я думаю, что об этом спросил OP.источник
__proto__
Свойство является устаревшим и практически не имеет преимущества передprototype
собственностью.