Creé un objeto JavaScript, pero ¿cómo puedo determinar la clase de ese objeto?
Quiero algo similar al .getClass()
método de Java .
javascript
oop
DNB5brims
fuente
fuente
class
tipo. Se hace tener unaclass
palabra clave yclass
la sintaxis para la creación de prototipos en los que los métodos pueden más fácilmente el accesosuper
.Respuestas:
No hay una contraparte exacta de Java
getClass()
en JavaScript. Principalmente, eso se debe a que JavaScript es un lenguaje basado en prototipos , en lugar de que Java sea un lenguaje basado en clases .Dependiendo de lo que necesite
getClass()
, hay varias opciones en JavaScript:typeof
instanceof
obj.
constructor
func.
prototype
,proto
.isPrototypeOf
Algunos ejemplos:
Nota: si está compilando su código con Uglify, cambiará los nombres de clase no globales. Para evitar esto, Uglify tiene un parámetro
--mangle
que puede establecer en falso usando gulp o gruñido .fuente
func.prototype
(sí, las funciones son objetos, pero laprototype
propiedad solo es relevante en los objetos de función).instanceof
/isPrototypeOf()
y el no estándar__proto__
Object.getPrototypeOf()
constructor.name
si su código se está minimizando. El nombre de la función cambiará arbitrariamente.construction.name
como un token que se debe ignorar / no minimizar. Además, la mayoría (si no todos) del software minificador proporcionan reglas de excepción.Es un método confiable en los navegadores modernos.
Function.name
se agregó oficialmente al estándar en ES6, lo que lo convierte en un medio compatible con los estándares para obtener la "clase" de un objeto JavaScript como una cadena. Si se crea una instancia del objetovar obj = new MyClass()
, devolverá "MyClass".Devolverá "Número" para números, "Matriz" para matrices y "Función" para funciones, etc. Generalmente se comporta como se esperaba. Los únicos casos en los que falla son si un objeto se crea sin un prototipo, vía
Object.create( null )
, o si el objeto fue instanciado desde una función definida anónimamente (sin nombre).También tenga en cuenta que si está minimizando su código, no es seguro compararlo con cadenas de tipo codificadas. Por ejemplo, en lugar de verificar si
obj.constructor.name == "MyType"
, en lugar de verificarobj.constructor.name == MyType.name
. O simplemente compare los propios constructores, sin embargo, esto no funcionará a través de los límites del DOM, ya que hay diferentes instancias de la función de constructor en cada DOM, por lo que hacer una comparación de objetos en sus constructores no funcionará.fuente
Function.name
(todavía) no es parte del estándar de JavaScript. Actualmente es compatible con Chrome y Firefox, pero no con IE (10).obj.constructor.name
solo funciona para funciones con nombre . Es decir, si definovar Foo = function() {}
, entonces forvar foo = new Foo()
,foo.constructor.name
te dará una cadena vacía.constructor.name
si su código se está minimizando. El nombre de la función cambiará arbitrariamente.constructor.name
comporta como se esperaba con el nuevo soporte de clase en ES6.Esta función devuelve
"Undefined"
valores indefinidos y"Null"
nulos.Para todos los demás valores,
CLASSNAME
se extrae la parte de[object CLASSNAME]
, que es el resultado del usoObject.prototype.toString.call(value)
.fuente
"Object"
.return obj.constructor.name
. Eso da los mismos resultados, además también maneja objetos no nativos.Para obtener la "pseudo clase", puede obtener la función de constructor, por
suponiendo que
constructor
se establece correctamente cuando hace la herencia, que es por algo como:y estas dos líneas, junto con:
hará
woofie.constructor
punto aDog
. Tenga en cuenta queDog
es una función constructora, y es unFunction
objeto. Pero puedes hacerif (woofie.constructor === Dog) { ... }
.Si desea obtener el nombre de la clase como una cadena, encontré que lo siguiente funciona bien:
http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects
Llega a la función constructora, la convierte en cadena y extrae el nombre de la función constructora.
Tenga en cuenta que
obj.constructor.name
podría haber funcionado bien, pero no es estándar. Está en Chrome y Firefox, pero no en IE, incluidos IE 9 o IE 10 RTM.fuente
Puede obtener una referencia a la función constructora que creó el objeto utilizando la propiedad constructor :
Si necesita confirmar el tipo de un objeto en tiempo de ejecución, puede usar el operador instanceof :
fuente
De acuerdo con su registro ininterrumpido de compatibilidad con versiones anteriores, ECMAScript 6, JavaScript todavía no tiene un
class
tipo (aunque no todos entienden esto). Se hace tener unaclass
palabra clave como parte de suclass
sintaxis para la creación de prototipos, pero todavía no hay cosa que se llama clase . JavaScript no es ahora y nunca ha sido un lenguaje clásico de OOP . Hablar de JS en términos de clase es solo engañoso o una señal de no haber heredado aún la herencia prototípica (solo mantenerla real).Eso significa que
this.constructor
sigue siendo una excelente manera de obtener una referencia a laconstructor
función. Ythis.constructor.prototype
es la forma de acceder al prototipo en sí. Como esto no es Java, no es una clase. Es el objeto prototipo del que se instancia su instancia. Aquí hay un ejemplo usando el azúcar sintáctico ES6 para crear una cadena prototipo:Esto es lo que genera usando
babel-node
:¡Ahí tienes! En 2016, hay una
class
palabra clave en JavaScript, pero aún no hay ningún tipo de clase.this.constructor
es la mejor manera de obtener la función de constructor,this.constructor.prototype
la mejor manera de obtener acceso al prototipo en sí.fuente
Tenía una situación para trabajar genérica ahora y usé esto:
esa es la única forma en que encontré para obtener el nombre de la clase por tipo de entrada si no tiene una instancia de un objeto.
(escrito en ES2017)
la notación de puntos también funciona bien
fuente
Para las clases Javascript en ES6 puede usar
object.constructor
. En la siguiente clase de ejemplo, elgetClass()
método devuelve la clase ES6 como cabría esperar:Si crea una instancia de la clase del
getClass
método, asegúrese de ponerla entre paréntesis, por ejemploruffles = new ( fluffy.getClass() )( args... );
fuente
Encuentro
object.constructor.toString()
retorno[object objectClass]
en IE, en lugar defunction objectClass () {}
regresar en chome. Entonces, creo que el código en http://blog.magnetiq.com/post/514962277/finding-out-class-names-of-javascript-objects puede no funcionar bien en IE. Y arreglé el código de la siguiente manera:código:
fuente
En javascript, no hay clases, pero creo que desea el nombre del constructor y
obj.constructor.toString()
le dirá lo que necesita.fuente
.name
..name
no está definido incluso en IE 9De acuerdo con dfa, es por eso que considero el prototipo como la clase cuando no se encuentra una clase con nombre
Aquí hay una función mejorada de la publicada por Eli Gray, para que coincida con mi forma de pensar
fuente
Si necesita no solo OBTENER la clase sino también EXTENDERla de tener solo una instancia, escriba:
tengamos
para extender A teniendo la instancia solo use:
fuente
Sugiero usar
Object.prototype.constructor.name
:fuente
Aquí hay una implementación de
getClass()
ygetInstance()
Puede obtener una referencia para la clase de un Objeto usando
this.constructor
.Desde un contexto de instancia:
Del contexto estático:
fuente
this.constructor
?También puedes hacer algo como esto
Esto le dirá si la entrada es de clase o no.
fuente
Javascript es un lenguaje sin clase: no hay clases que definan el comportamiento de una clase estáticamente como en Java. JavaScript utiliza prototipos en lugar de clases para definir las propiedades de los objetos, incluidos los métodos y la herencia. Es posible simular muchas características basadas en clases con prototipos en JavaScript.
fuente
class
tipo. Se hace tener unaclass
palabra clave yclass
la sintaxis para la creación de prototipos en los que los métodos pueden más fácilmente el accesosuper
.La pregunta parece ya respondida, pero el OP quiere acceder a la clase y al objeto, tal como lo hacemos en Java y la respuesta seleccionada no es suficiente (en mi humilde opinión).
Con la siguiente explicación, podemos obtener una clase de un objeto (en realidad se llama prototipo en javascript).
Puede agregar una propiedad como esta:
Pero la
.last
propiedad solo estará disponible paraarr
el objeto ' ' que se crea una instancia del prototipo de matriz. Entonces, para que la.last
propiedad esté disponible para todos los objetos instanciados del prototipo de matriz, tenemos que definir la.last
propiedad para el prototipo de matriz:¡El problema aquí es que debes saber a qué tipo de objeto (prototipo) pertenecen las variables '
arr
' y 'arr2
'! En otras palabras, si no conoce el tipo de clase (prototipo) delarr
objeto ' ', no podrá definir una propiedad para ellos. En el ejemplo anterior, sabemos que arr es una instancia del objeto Array, por eso usamos Array.prototype para definir una propiedad para Array. Pero, ¿y si no supiéramos la clase (prototipo) del 'arr
'?Como puede ver, sin saber que '
arr
' es un Array, podemos agregar una nueva propiedad simplemente haciendo referencia a la clase de 'arr
' usando 'arr.__proto__
'.Accedimos al prototipo del '
arr
' sin saber que es una instancia de Array y creo que eso es lo que preguntó OP.fuente
__proto__
propiedad está en desuso y casi no tiene ventaja sobre laprototype
propiedad.