Сохраняет ли Chrome конструктор каждого объекта?
В консоли Chrome JavaScript:
> function create(proto) {
function Created() {}
Created.prototype = proto
return new Created
}
undefined
> cc = create()
Created {}
> cc
Created {}
Created
это функция, частная дляcreate
функция; послеcreate
завершено, нет никаких (известных мне) ссылок наCreated
, Тем не менее, Chrome может показывать имя функции в любое время, начиная с созданного им объекта.
Chrome не достиг этого, следуя «наивному» подходу:
> cc.constructor
function Object() { [native code] }
> cc.toString()
"object [Object]"
и вообще я не ставилconstructor
наproto
аргумент переданcreate
:
> cc.__proto__.hasOwnProperty("constructor")
false
Одно предположение у меня было, что виртуальная машина JavaScript держитсяCreated
радиinstanceof
механизм. Он сказал, чтоinstanceof
проверяет, имеет ли объект в своей цепочке прототипов свойство prototype конструктора.
Но в приведенном выше коде я набралcreate()
эффективно проходяundefined
в качестве прототипа; вследствие этогоCreated
даже не имеет своегоprototype
установить на фактическийcc.__proto__
, Мы можем проверить это, если мы взломатьcreate
разоблачитьCreated
функция:
function create(proto) {
function Created() {}
Created.prototype = proto
GlobalCreated = Created
return new Created
}
теперь давайте наберем
> cc = create()
Created {}
> GlobalCreated
function Created() {}
> GlobalCreated.prototype
undefined
> cc instanceof GlobalCreated
TypeError: Function has non-object prototype 'undefined' in instanceof check
Мои вопросы (все тесно связаны):Что именно движок JavaScript Chrome сохраняет для того, чтобы это представление объекта в консоли работало? Это функция конструктора или просто имя функции?
Это удержание необходимо для чего-то более существенного, чем распечатка консоли?
Каково влияние такого удержания на потребление памяти? Что если, например, функция конструктора (или даже ее имя) ненормально огромна?
Это просто Chrome? Я перепроверил Firebug и Safari, их консоли не представляют объект таким образом. Но сохраняют ли они те же данные для других возможных целей (например, из-за подлинной озабоченности, присущей JavaScript-виртуальной машине)?