2012-05-05 8 views
5

Sí, he visto esto preguntado y respondido antes. Pero esto es lo que todavía no entiendo:¿Otro más "cómo encontrar el nombre de clase/constructor de un objeto Javascript"?

Si creo una función constructora, y no anula las propiedades de la función prototype, entonces tenemos la propiedad constructor automática colgando fuera de la propiedad de la función prototype. Eso es MyConstructor.prototype.constructor === MyConstructor => verdadero. Estupendo. Pero ahora, ¿qué sucede cuando anulo prototype con mi propio objeto y no repare la propiedad constructor? constructor ahora no existe en prototype, y si se hace referencia solo se encuentra en la cadena de prototipos, es decir MyConstructor.prototype.constructor === Object => verdadero. Multa. Entonces ...

¿Por qué es que en un depurador de Javascript (como Chrome), si anulo el prototipo de un constructor con mi propio objeto, y actualizo una instancia de ese constructor, y luego escribo esa variable de instancia en el comando línea, Chrome felizmente me dice el tipo? ¿Cómo lo sabe? Es decir. ¿Qué puedo hacer para descubrir lo mismo a través del código?

repro simple:

> function Foo() {} 
undefined 
> Foo.prototype.constructor === Foo 
true 
> Foo.prototype = {} 
Object 
> Foo.prototype.constructor === Foo 
false 
> f = new Foo() 
Foo 
> f 
Foo 

¿Es magia pura depurador?

+0

La asociación todavía está allí en algún lugar, ya que 'f instanceof Foo' devuelve' true', pero no creo que esté expuesta al código de usuario. Supongo que lo convierte en pura depuración mágica. –

+1

Este parece relacionado g13n

+0

Firefox parece carecer de la magia del depurador ya que el f = new Foo() yf lines devuelven [objeto Object] que la respuesta vinculada explica más arriba – nvuono

Respuesta

0

Tal vez la solución es simplemente no configurar el prototipo para su objeto personalizado? Puede recorrer todas las propiedades de su objeto personalizado y agregarlas como propiedades al prototipo existente, conservando así todas las propiedades del objeto prototipo original, como el constructor.

+0

Eso, o agrega una propiedad a tu objeto prototipo personalizado que contiene una referencia a la función de constructor, o incluso simplemente una cadena personalizada o algo que puedes verificar ... – JKing

Cuestiones relacionadas