пятница, 13 октября 2006 г.

JavaScript откуда берутся prototype и constructor

Всё-же откуда берутся prototype и constructor.
Спасибо товарищу Zeroglif с форума dklab.ru.
(http://forum.dklab.ru/comments/nablas/40InheritanceInJavascript.html)
Zeroglif приводит следующий пример:

function A() {}; //первый конструктор
function B() {}; //второй конструктор

b = new B(); // создаём объект-экземпляр с помощью B;

A.prototype = b; // переопределяем объект-прототип

a = new A(); // создаём объект-экземпляр с помощью A;

alert(a.constructor) // function B() {}

Далее он обьясняет как и что происходит при работе
интерпретатора JavaScript. Я попробовал изобразить графически,
что происходит при создании объекта-конструктора и обьекта-экземпляра.
Итак:
А - обьект-конструктор, при его создании создаётся обьект-прототип.
Между обьектом-конструктором и обьектом-прототипом отношения изображённые
стрелками:
- Ра прототип для А
- А конструктор для Ра
Далее создаём обьект "a":
У обьекта "a" появляется неявная ссылка [[prototype]], которая
указывает на Pa. Адрес для этой ссылки обьект берёт из свойств своего
конструктора, ведь у А прототип Ра.

Теперь переопределеям прототип A:
A.prototype = b
Что получается?
Теперь при создании обьекта "а" создаётся неявная ссылка [[prototype]],
которая в соответсвии со своим конструкторм указывает на "b".
После этого при запросе методов и свойств у "а",
которых у него нет, присходит поиск по цепочке прототипов. У нас
прототипом "а" является "b".
Запрашиваем свойство конструктор:
1) у "а" такого свойства нет
2) ищем у прототипа "а", то есть у "b"
3) у "b" такого свойства нет
4) ищем у прототипа "b", то есть у "Pb"
5) у "Pb" это свойство указывает на "B"

Рисунок 1

Рисунок 2