Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

160
Vistas
Obtener el nombre de clase de la instancia de clase ES6

¿Hay formas 'armoniosas' de obtener el nombre de clase de la instancia de clase ES6? Otro que

 someClassInstance.constructor.name

Actualmente cuento con la implementación de Traceur. Y parece que Babel tiene un polyfill para Function.name mientras que Traceur no.

En resumen: no había otra manera en ES6/ES2015/Harmony, y no se espera nada de ATM en ES.Next.

Puede proporcionar patrones útiles para aplicaciones del lado del servidor no minimizadas, pero no es deseado en aplicaciones diseñadas para navegador/escritorio/móvil.

Babel usa core-js para polyfill Function.name , debe cargarse manualmente para las aplicaciones Traceur y TypeScript según corresponda.

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

someClassInstance.constructor.name es exactamente la forma correcta de hacer esto. Es posible que los transpiladores no admitan esto, pero es la forma estándar según la especificación. (La propiedad de name de las funciones declaradas a través de las producciones ClassDeclaration se establece en 14.5.15 , paso 6).

over 4 years ago · Santiago Trujillo Denunciar

0

Como dice @Domenic, use someClassInstance.constructor.name . @Esteban menciona en los comentarios que

someClassInstance.constructor es una función. Todas las funciones tienen una propiedad de name ...

Por lo tanto, para acceder al nombre de la clase de forma estática, haga lo siguiente (esto funciona con mi versión de Babel por cierto. De acuerdo con los comentarios en @Domenic, su kilometraje puede variar).

 class SomeClass { constructor() {} } var someClassInstance = new SomeClass(); someClassInstance.constructor.name; // === 'SomeClass' SomeClass.name // === 'SomeClass'

Actualizar

Babel estuvo bien, pero feo/minificación terminó causándome problemas. Estoy creando un juego y estoy creando un hash de recursos de Sprite agrupados (donde la clave es el nombre de la función). Después de la minificación, cada función/clase se nombró t . Esto mata el hachís. Estoy usando Gulp en este proyecto, y después de leer los documentos de gulp-uglify , descubrí que hay un parámetro para evitar que ocurra esta modificación del nombre de función/variable local. Entonces, en mi gulpfile cambié

.pipe($.uglify()) a .pipe($.uglify({ mangle: false }))

Aquí hay una compensación de rendimiento frente a legibilidad. No manipular los nombres dará como resultado un archivo de compilación (ligeramente) más grande (más recursos de red) y una ejecución de código potencialmente más lenta (cita necesaria, puede ser BS). Por otro lado, si lo mantuviera igual, tendría que definir manualmente getClassName en cada clase de ES6, a nivel estático y de instancia. ¡No, gracias!

Actualizar

Después de la discusión en los comentarios, parece que evitar la convención .name a favor de definir esas funciones es un buen paradigma. Solo toma unas pocas líneas de código y permitirá la minificación completa y la generalidad de su código (si se usa en una biblioteca). Así que supongo que cambio de opinión y definiré manualmente getClassName en mis clases. Gracias @estus! . Getter/Setters suelen ser una buena idea en comparación con el acceso directo a variables de todos modos, especialmente en una aplicación basada en el cliente.

 class SomeClass { constructor() {} static getClassName(){ return 'SomeClass'; } getClassName(){ return SomeClass.getClassName(); } } var someClassInstance = new SomeClass(); someClassInstance.constructor.getClassName(); // === 'SomeClass' (static fn) someClassInstance.getClassName(); // === 'SomeClass' (instance fn) SomeClass.getClassName() // === 'SomeClass' (static fn)
over 4 years ago · Santiago Trujillo Denunciar

0

Obteniendo el nombre de la clase directamente de la clase

Las respuestas anteriores explicaron que someClassInstance.constructor.name funciona bien, pero si necesita convertir el nombre de la clase mediante programación en una cadena y no desea crear una instancia solo para eso, recuerde que:

 typeof YourClass === "function"

Y, dado que cada función tiene una propiedad de name , otra buena manera de obtener una cadena con el nombre de su clase es simplemente hacer:

 YourClass.name

Lo que sigue es un buen ejemplo de por qué esto es útil.

Cargando componentes web

Como nos enseña la documentación de MDN , así es como se carga un componente web:

 customElements.define("your-component", YourComponent);

Donde YourComponent es una clase que se extiende desde HTMLElement . Dado que se considera una buena práctica nombrar la clase de su componente después de la etiqueta del componente en sí, sería bueno escribir una función de ayuda que todos sus componentes puedan usar para registrarse. Así que aquí está esa función:

 function registerComponent(componentClass) { const componentName = upperCamelCaseToSnakeCase(componentClass.name); customElements.define(componentName, componentClass); }

Así que todo lo que necesitas hacer es:

 registerComponent(YourComponent);

Lo cual es bueno porque es menos propenso a errores que escribir la etiqueta del componente usted mismo. Para terminar, esta es la función upperCamelCaseToSnakeCase() :

 // converts `YourString` into `your-string` function upperCamelCaseToSnakeCase(value) { return value // first char to lower case .replace(/^([AZ])/, $1 => $1.toLowerCase()) // following upper chars get preceded with a dash .replace(/([AZ])/g, $1 => "-" + $1.toLowerCase()); }
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda