Почему я могу хранить объект как свою собственность? Вот простой пример:
let obj = {};
obj['obj'] = obj;
Это приведет к созданию бесконечного дерева объектов: я могу вызвать obj
с obj.obj.obj.obj
или даже с obj.obj.obj.vobj.obj.obj.obj.obj
.
Это проблема производительности? Кажется, он вообще не беспокоит браузер.
Фактически, когда я смотрю на консоль в Chrome и нажимаю для расширения свойств obj
он говорит (по подсказке i):
Значение ниже было оценено только сейчас
Поэтому они были оценены только тогда, когда я нажал, чтобы развернуть.
Означает ли это, что JavaScript тоже не будет смотреть на свойство obj
пока я действительно не obj
доступ к ним?
Является ли obj.obj
просто ссылкой на obj
?
Это проблема производительности?
Нет. Циркулярная ссылка - это как любая другая ссылка. У каждого экземпляра класса есть круговая ссылка:
instance.constructor.prototype.constructor.protototype
Является ли
obj.obj
просто ссылкой наobj
?
Да.
Означает ли это, что JavaScript тоже не будет смотреть на свойство
obj
пока я действительно неobj
доступ к ним?
Да. И консоль не будет пытаться расширять ее, поскольку она будет попадаться в бесконечный цикл.
window.window.window
,window.top.top.top
т. д. - все просто ссылки на один и тот же объект