Задать вопрос
@Dimon123
Новичок, разбираюсь в веб-программировании

Где лежат объекты-прототипы, например, объект HTMLParagraphElement?

Привет.
У меня много вопросов по Браузерной Объектной Модели. Непонятного больше, чем понятного.
Хочу разобраться в структуре BOM.
Вопрос 1: Если взять документ, в элементе <body></body> есть только ОДИН элемент параграф (для простоты) <p id="1"> </p> в моем документе с атрибутом id="1", то при анализе браузером моего документа, браузер В ПАМЯТИ строит дерево BOM, куда и DOM входит. Мой элемент становится объектом p. Объект p занимается КОНКРЕТНОЕ место в BOM - window.document.lastChild(попал на объект html).lastChile(попал на объект body).firstChild(попал на объект p).
Вопрос: ГДЕ ЛЕЖАТ ВСЕ ОБЪЕКТЫ ЦЕПИ ПРОТОТИПОВ параграфа p - HTMLParagraphElement, HTMLElement, Element, Node...
Если взять, например, объект-прототип HTMLParagraphElement (document.getElementById("1").__proto__;), и спросить "А кто у тебя родитель или сосед?" (document.getElementById("1").__proto__.parentNode;), то выдает ошибку Uncaught TypeError: Illegal invocation.
Вопрос 2: Была идея о том, что, может, эти объекты-прототипы лежат в корне объекта window (из тех соображений, что все созданные программистом переменные, объекты, объекты-прототипы, функции ЛЕЖАТ В КОРНЕ объекта window), залез и посмотрел. Наткнулся на какие-то странные функции конструкторы, которые имеют одинаковые с прототипами имена + у них есть свойство __proto__ и constructor ОДНОВРЕМЕННО. Как у функции-конструктора может быть прототип? Я думал, что прототип только у объекта обычного может быть.
c32d38f1a2f241b2881afe1b14bfb00e.jpgВопрос 3: Оказалось, что у объекта window есть прототип С ТАКИМ ЖЕ ИМЕНЕМ и еще еще дальше прототипы идут. А они где лежат?. Я думал, что объект window самый верхний. В общем, путаница какая-то - "что-то в чем-то внутри чего-то".
Помогите, пожалуйста, разгрести эту кашу.
  • Вопрос задан
  • 232 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@Dimon123 Автор вопроса
Новичок, разбираюсь в веб-программировании
1. parentNode – это «типа свойство», а не обычное свойство. Для программиста оно кажется обычным свойством, а на самом деле – это пара геттер плюс сеттер, которые являются функциями и имитируют обычное свойство. Вызываться «типа свойство»parentNode может ТОЛЬКО ИЗНУТРИ, например, объекта-параграфа p(document.getElementById("red"). parentNode;) и аналогичных – изнутри объектов, которые из элементов документа при анализе получились, так как геттеры и сеттеры у «типа свойств» имеют this и эти геттеры и сеттеры запрограммированы только для вызова изнутри параграфа р и других объектов, которые из элементов получились. То есть, во всей цепи прототипов геттеры и сеттеры стоят в основном, расчет свойств для объектов (для объекта-параграфа p (document.getElementById("red"). parentNode;) и аналогичных – изнутри объектов, которые из элементов документа при анализе получились) ведется на лету в ДИНАМИКЕ. то есть, они рассчитываются только при обращении к ним, а не постоянно там "сидят", как обычные свойства. А когда я писал document.getElementById("red").__proto__.parentNode; , то КОНТЕКСТ был не тот, в котором "типа свойство" parentNode запрограммировано работать (там куча this). Вот и выдавало фигню Illegal invocation.
2 Я хотел узнать, где в дереве BOM лежат следующие объекты: а) Функции-конструкторы для объектов-прототипов function HTMLИмяElement(), function HTMLElement(), function Element(), function HTMLDocument(), function Document(), function CharacterData(), function Text(), function Comment(), function Attr(), function Node() + б) Одноименные объекты-прототипы HTMLИмяElement, HTMLElement, Element, HTMLDocument, Document, CharacterData, Text, Comment, Attr, Node, которые создаются соответствующими одноименными функциями-конструкорами + в) функции-конструкторы созданных программистом объектов (Array, Number, Function, Object..., объекты-прототипы созданных программистом объектов (Array.prototype, Number.prototype, Function.prototype, Object.prototype ...
И ошибочно использовал для этого "типа свойства" (а на самом функции геттеры и сеттеры), которые маскируются под обычные свойства (например, name:1) parentNode, firstChild, firstElementChild и другие из объектов-прототипов Node, Element, HTMLElement... Думал, раз свойство определено, то оно должно работать даже в самом объекте-прототипе (в его контексте, то есть изнутри его). Но я тогда не знал про геттеры и сеттеры.
КУДА конкретно они прикреплены к объекту window – не узнать, так как нет для этого специальных свойств и методов.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
miraage
@miraage
Старый прогер
< window.window === window
> true
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы