¿Conserva Chrome el constructor de cada objeto?
En la consola de JavaScript de Chrome:
> function create(proto) {
function Created() {}
Created.prototype = proto
return new Created
}
undefined
> cc = create()
Created {}
> cc
Created {}
Created
Es una función privada de lacreate
función; despuéscreate
completa, no hay referencias (conocidas para mi) aCreated
. Sin embargo, Chrome puede mostrar el nombre de la función en cualquier momento, a partir del objeto creado por ella.
Chrome no logró esto siguiendo el enfoque "ingenuo":
> cc.constructor
function Object() { [native code] }
> cc.toString()
"object [Object]"
y de todos modos, no me puseconstructor
sobre elproto
argumento pasado acreate
:
> cc.__proto__.hasOwnProperty("constructor")
false
Una suposición que tuve es que la máquina virtual de JavaScript se mantiene enCreated
por el bien de lainstanceof
mecanismo. Se dice queinstanceof
comprueba si un objeto tiene en su cadena prototipo la propiedad prototipo de un constructor.
Pero en el código anterior escribícreate()
pasando efectivamenteundefined
como prototipo; por consiguienteCreated
ni siquiera tiene suprototype
establecer en el realcc.__proto__
. Podemos verificar esto si hackeamoscreate
para exponer elCreated
función:
function create(proto) {
function Created() {}
Created.prototype = proto
GlobalCreated = Created
return new Created
}
ahora vamos a escribir
> cc = create()
Created {}
> GlobalCreated
function Created() {}
> GlobalCreated.prototype
undefined
> cc instanceof GlobalCreated
TypeError: Function has non-object prototype 'undefined' in instanceof check
Mis preguntas (todas muy relacionadas):¿Qué retiene exactamente el motor de JavaScript de Chrome para hacer que la presentación del objeto en la consola funcione? ¿Es la función constructora, o simplemente el nombre de la función?
¿Es necesaria esa retención para algo más importante que la impresión de la consola?
¿Cuál es el efecto de dicha retención en el consumo de memoria? ¿Qué sucede si, por ejemplo, la función constructora (o incluso su nombre) es anormalmente enorme?
¿Es solo Chrome? He vuelto a probar con Firebug y Safari, sus consolas no presentan el objeto de esa manera. ¿Pero aún conservan los mismos datos, para otros posibles propósitos (por ejemplo, debido a una preocupación genuina inherente a una máquina virtual de JavaScript)?