O Chrome mantém o construtor de cada objeto?
No console JavaScript do Chrome:
> function create(proto) {
function Created() {}
Created.prototype = proto
return new Created
}
undefined
> cc = create()
Created {}
> cc
Created {}
Created
é uma função privada para ocreate
função; depois decreate
for concluída, não há referências (conhecidas por mim) aCreated
. No entanto, o Chrome pode mostrar o nome da função a qualquer momento, começando no objeto criado por ela.
O Chrome não conseguiu isso seguindo a abordagem "ingênua":
> cc.constructor
function Object() { [native code] }
> cc.toString()
"object [Object]"
e de qualquer maneira, eu não coloqueiconstructor
noproto
argumento passado paracreate
:
> cc.__proto__.hasOwnProperty("constructor")
false
Um palpite que tive é que a VM JavaScript se apega aCreated
por uma questão deinstanceof
mecanismo. Dizem queinstanceof
testa se um objeto tem em sua cadeia de protótipos a propriedade prototype de um construtor.
Mas no código acima eu digiteicreate()
passando efetivamenteundefined
como protótipo; consequentementeCreated
nem sequer tem o seuprototype
definido para o realcc.__proto__
. Podemos verificar isso se hackearmoscreate
expor oCreated
função:
function create(proto) {
function Created() {}
Created.prototype = proto
GlobalCreated = Created
return new Created
}
agora vamos digitar
> cc = create()
Created {}
> GlobalCreated
function Created() {}
> GlobalCreated.prototype
undefined
> cc instanceof GlobalCreated
TypeError: Function has non-object prototype 'undefined' in instanceof check
Minhas perguntas (todas estreitamente relacionadas):O que exatamente o mecanismo JavaScript do Chrome mantém para fazer com que a apresentação do objeto no console funcione? É a função construtora ou apenas o nome da função?
Essa retenção é necessária para algo mais substancial do que a impressão do console?
Qual é o efeito dessa retenção no consumo de memória? E se, por exemplo, a função construtora (ou mesmo o nome) for anormalmente grande?
É apenas o Chrome? Testei novamente com o Firebug e o Safari, seus consoles não apresentam o objeto dessa maneira. Mas eles ainda retêm os mesmos dados para outros fins possíveis (por exemplo, devido a uma preocupação genuína inerente a uma VM JavaScript)?