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

classtipo. Se hace tener unaclasspalabra clave yclassla 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:typeofinstanceofobj.constructorfunc.prototype,proto.isPrototypeOfAlgunos 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
--mangleque puede establecer en falso usando gulp o gruñido .fuente
func.prototype(sí, las funciones son objetos, pero laprototypepropiedad solo es relevante en los objetos de función).instanceof/isPrototypeOf()y el no estándar__proto__Object.getPrototypeOf()constructor.namesi su código se está minimizando. El nombre de la función cambiará arbitrariamente.construction.namecomo 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.namese 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.namesolo funciona para funciones con nombre . Es decir, si definovar Foo = function() {}, entonces forvar foo = new Foo(),foo.constructor.namete dará una cadena vacía.constructor.namesi su código se está minimizando. El nombre de la función cambiará arbitrariamente.constructor.namecomporta 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,
CLASSNAMEse 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
constructorse establece correctamente cuando hace la herencia, que es por algo como:y estas dos líneas, junto con:
hará
woofie.constructorpunto aDog. Tenga en cuenta queDoges una función constructora, y es unFunctionobjeto. 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.namepodrí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
classtipo (aunque no todos entienden esto). Se hace tener unaclasspalabra clave como parte de suclasssintaxis 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.constructorsigue siendo una excelente manera de obtener una referencia a laconstructorfunción. Ythis.constructor.prototypees 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
classpalabra clave en JavaScript, pero aún no hay ningún tipo de clase.this.constructores la mejor manera de obtener la función de constructor,this.constructor.prototypela 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
getClassmé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..nameno 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
classtipo. Se hace tener unaclasspalabra clave yclassla 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
.lastpropiedad solo estará disponible paraarrel objeto ' ' que se crea una instancia del prototipo de matriz. Entonces, para que la.lastpropiedad esté disponible para todos los objetos instanciados del prototipo de matriz, tenemos que definir la.lastpropiedad 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) delarrobjeto ' ', 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 laprototypepropiedad.