В консоли 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
}
теперь пусть type
> cc = create()
Created {}
> GlobalCreated
function Created() {}
> GlobalCreated.prototype
undefined
> cc instanceof GlobalCreated
TypeError: Function has non-object prototype 'undefined' in instanceof check
Мои вопросы (все тесно связанные):
-
Что именно поддерживает Chrome JavaScript, чтобы сделать презентацию этого объекта в консоли? Является ли это конструкторной функцией или просто именем функции?
-
Требуется ли сохранение для чего-либо более существенного, чем распечатка консоли?
-
Каков эффект такого удержания на потребление памяти? Что, если, например, функция конструктора (или даже его имя) аномально огромна?
-
Это просто Chrome? Я проверил с Firebug и Safari, их консоли не представляют объект таким образом. Но сохраняют ли они все те же данные для других возможных целей (например, из-за подлинной озабоченности, присущей виртуальной машине JavaScript)?

