Показать сообщение отдельно
Старый 02.04.2008, 16:48
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 14  
Ответить с цитированием
chingachgoog
Banned
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Раз уж возник вопрос… Очень часто спрашивают меня.
Тут подумал как лучше объяснить прототипы

Забудьте про классы и т.п., т.к. в AVM1 ничего этого нет на самом деле
Есть только объекты и функции (особые объекты).

1) У любой функции есть свойство (объект) под названием prototype.

2) У любого объекта есть свойство-указатель на объект prototype той функции при помощи которой он был построен (конструктор класса). Это свойство указатель называется __proto__

А также свойство-указатель на саму функцию (конструктор класса) под названием constructor.

Соответственно, можно сказать, что у объектов (исключая функции) не бывает свойство prototype, но у функции есть свойства __proto__, т.к. функция - это тоже объект.

Когда мы смотрим какое-то свойство у объекта, сначала проверяется объект, если оно там не найдено, то по ссылке __proto__ проверяется объект prototype функции-конструктора, далее по ссылке __proto__ в самом прототипе смотриться следующий прототип и т.д. до конца цепочки наследования (до Object.prototype)

Код:
createEmptyMovieClip("mc",1) // создаем для примера мувик под именем mc

trace(mc.__proto__==MovieClip.prototype) // мувиклип под именем mc был построен функцией (классом) под именем MovieClip и имеет ссылку __proto__ на prototype своего класса-конструктора

trace(MovieClip.prototype.__proto__==Object.prototype) // цепочка наследлвания всегда завершается в Object.prototype

function Class(){}

trace(Class.constructor instanceof Function) // функция (класс) под именем Class построенна функцией (классом) под именем Function

trace(Class.__proto__==Function.prototype) // функция (класс) под именем Class была построенна функцией (классом) под именем Function и имеет ссылку __proto__ на свойство-объект prototype своего класса-конструктора

trace(Function.prototype.__proto__==Object.prototype) // цепочка наследлвания всегда завершается в Object.prototype

trace(mc.prototype==_global.prototype ) // собственно билиберда, т.к. undefined=undefined - у объектов (исключая функции) не бывает свойство prototype
PS в настройках паблиша надо включить AS1, чтобы слово Function не конфликтовало с компилятором AS2.