Тема: Про ecmaScript
Показать сообщение отдельно
  #26 (permalink)  
Старый 20.12.2011, 12:41
Кандидат Javascript-наук
Отправить личное сообщение для Иваннн Посмотреть профиль Найти все сообщения от Иваннн
 
Регистрация: 31.05.2010
Сообщений: 106

Спасибо все понял.
У меня было два заблуждения:
1)что цепочка прототипов это не только __proto__.__proto__..и т.д., но и constructor.prototype. Обратное мне пытались сказать Некромансер и др., но я не догонял. Меня сбило с толку равенство объект.__proto__===объект.constructor. prototype ( True причем не всегда, смотри второе заблуждение). Оказывается что перейти на прототип выше (по прототипной цепочке) можно исключительно через неявное свойвство объекта [[prototype]] ( в некоторых браузерах- явная ссылка __proto__). Согласно спецификации при создании объекта функции(далее F) создается свойвство объекта функции prototype, которое ссылается на обект ( далее Р), свойвства которого будут унаследованы объектом, создаваемым указанной функцией F (допустим при использовании оператора new F()). Но в процессе создания нашей функции (F) у объекта Р создается свойвство (собственное) constructor.
Это свойвство как раз и ссылается на нашу функцию F. Получается замкнутый круг :P.constructor.prototype===P(-true при не изменении значения свойвства prototype ).
2) я упустил из виду, что свойвство constructor для объекта, построенного с помощю нашей функции F (пусть будет О) не родное свойвство, а наследуемое. А кто следующий в цепочке? O.__proto__- в нем то и содержится родное свойвство constructor.
После изменения свойвства конструктора F.prototype с дефаултного на любой другой объект (т.е. изменения прототипа создаваемого объекта О), при вызове O.constructor это свойвсто c именем constructor будет искатся в нем (в О), потом при отсутсвии в O.__proto__, знечение которого уже не старый прототип P, а новый подставленный объект.

Все это хорошо описано на данном сайте в разделе обучение (Lern((как-то так).javascript.ru) а я написал все это для того чтобы мне ответили правильно ли я всю эту кухню понял. Отдельное спасибо Некромансеру за терпение.

Последний раз редактировалось Иваннн, 20.12.2011 в 12:45.
Ответить с цитированием