5

Estoy tratando de determinar las reglas para generar nombres de clase en javascript. Pegué este script en Chrome herramientas dev consola:¿Cómo se calculan los nombres de las clases javascript para clases personalizadas en Herramientas de desarrollo de Chrome?

var obj = { 
    Constr : function() { } 
}; 

var obj2 = obj; 
console.log(new obj.Constr()); 
console.log(new obj2.Constr()); 

obj2.Constr2 = function() { }; 
console.log(new obj.Constr2()); 
console.log(new obj2.Constr2()); 

Y son los resultados en la consola aquí:

obj.Constr 
obj.Constr 
obj2.Constr2 
obj2.Constr2 

Parece ser que el nombre de la clase está determinada por la variable que la función constructora fue asignado originalmente a. Estoy buscando las reglas precisas que utiliza CDT para generar este nombre. Además, ¿es este el mismo nombre que reconoce Google Closure Compiler?

He intentado ver si puedo reproducir un comportamiento similar en Firebug, pero parece que no puedo obtener nombres de clases para imprimir en la consola. Como una pregunta secundaria, ¿alguien sabe cómo ver esto en Firebug?

Respuesta

3

No hay clases en Javascript, ya que es un OOP basado en prototipos, no basado en clases. Chrome aparentemente hace alguna deducción para imprimir alguna descripción del objeto en la consola, pero eso no es un Javascript estándar: en el estándar, los objetos no tienen clase nombrada, y no se puede averiguar el nombre de la clase a la que pertenece el objeto, ya que la única herencia se realiza a través de la pseudo-propiedad real [[Prototype]] interna, que también es un objeto en sí mismo, sin nombre o "clase". Por lo general, puede deducir algo similar a un nombre de clase mirando object.__proto__.constructor.name, que devolvería el nombre de la función que es el constructor desde el que se creó la instancia del objeto; pero esta función puede ser anónima, o su navegador no sea compatible con el __proto__ propiedad no estándar, o el prototipo del objeto no puede contener una referencia correcta a su constructor. En general, no puede conocer la "clase" de un objeto en JS; solo puede probar la descendencia (object instanceof Constructor), pero eso aún se implementa de acuerdo con la propiedad constructor en el prototipo del objeto, que podría ser incorrecta.

+1

Así que, como temía, el nombre impreso por CDT no proviene de las especificaciones de ecmascript. Es solo una conveniencia de depuración para el desarrollador. Soy bastante nuevo en Javascript y, en general, me gusta el estilo de prototipo, pero me parece decepcionante que bibliotecas como dojo y extjs intenten calzarse en el estilo de programación OO. Creo que esto confunde una de las mejores características de Javascript. –

+1

Javascript es un lenguaje muy original, y en realidad es bastante flexible. Hay muchas bibliotecas construyendo un OO típico basado en clase _en la parte superior_ de Javascript, y eso generalmente funciona bastante bien. Esto no es necesariamente malo para esas bibliotecas o el Javascript mismo. – lanzz

Cuestiones relacionadas