В консоли 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)?