Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Не срабатывает onLoadComplete внутри прототипа (http://www.flasher.ru/forum/showthread.php?t=110390)

ra26info 02.04.2008 05:51

А есть ли в конечном результате разница между прототипом и объектом? Или это что-то вроде: «ООП лучше» вечная тема.

Вопрос серьёзный... я не программист.

п.с. «страшнее того» мой код так плох?

screamge 02.04.2008 15:58

Он не правильный.

chingachgoog 02.04.2008 16:37

Попробуйте вот так:

Код:

MovieClip.prototype.contentloader = function(){

        this.createEmptyMovieClip('pic', this.getNextHighestDepth());

        var mcl = new MovieClipLoader ();
        mcl.addListener (this);
        var i = 0;
        var rootName = ["my1.jpg"];
        var mcOld = null;

        this.onLoadInit = function () {
                var mc = this.pic.createEmptyMovieClip ("mc" + i, i);
                mcl.loadClip (rootName[i], mc);
                mc._x = 10;
                mc._y = ((mcOld._y + mcOld._height) || 0) + 10;;
                mcOld = mc;
                i++;
        }

        mcl.onLoadComplete = function () {
                        trace ("Загржено mc"+[i]);
                };


        mcl.onLoadError = function () {
                trace ("Загрузка завершена");
        };
       
        this.onLoadInit ();

}

this.contentloader(); // запускаем загрузку

AS1 - это такой же ООП язык как и AS2 и AS3. Со своими плюсами и минусами. Модно - не значит лучше. Кстати прототипы есть и в AS3.

chingachgoog 02.04.2008 16:48

Раз уж возник вопрос… Очень часто спрашивают меня.
Тут подумал как лучше объяснить прототипы :)

Забудьте про классы и т.п., т.к. в 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.

screamge 02.04.2008 17:08

А никто не спорит что на АС1 можно было писать по правилам ООП, другой вопрос является ли он ООП языком или нет.
Если настаиваете на своём коде то так правильнее:
Код:

MovieClip.prototype.contentloader = function(){
        var mcl = new MovieClipLoader ();
        mcl.addListener (this);
        var i = 0;
        var rootName = ["my1.jpg"];
        var mcOld = null;

        this.onLoadInit = function () {
                mc._x = 10;
                mc._y = ((mcOld._y + mcOld._height) || 0) + 10;;
                mcOld = mc;
                i++;
        }

        mcl.onLoadComplete = function () {
                        trace ("Загржено mc"+[i]);
                };


        mcl.onLoadError = function () {
                trace ("Загрузка завершена");
        };
       
        var mc = this.createEmptyMovieClip ("mc" + i, i);
        mcl.loadClip (rootName[i], mc);
}

this.contentloader();


divinus 02.04.2008 17:46

2screamge, вообще-то AS это именно язык на основе прототипов... а язык на основе прототипов, это стиль ООП программирования...

screamge 03.04.2008 02:58

Если речь идёт об АС1 то:
Цитата:

А никто не спорит что на АС1 можно было писать по правилам ООП
АС2 и 3 не являются прототипными.

chingachgoog 03.04.2008 11:14

Не знаю, что там адобовцы намудрили с AVM2 (мало информации), но вот AVM1 работает исключительно на прототипах, т.е. AS1 и AS2 - прототипные.
А так-как прототипы поддерживаются и в AS3, то есть у меня большие подозрения, что и AVM2 на самом деле прототипная.

Да, можно подойти к вопросу строго формально и тогда, синтаксически, AS2 и AS3 не будут прототипными. Но мне кажется это ремесленеческий подход.

ra26info 03.04.2008 11:19

Спасибо за интересные ответы.

А если вернуться к этому вопросу:
Цитата:

А есть ли в конечном результате разница между прототипом и объектом? Или это что-то вроде: «ООП лучше» вечная тема.
..из поста chingachgoog я понял что прототип, это ссылка на функцию В принципе, это я и так понимал.. но за подробное объяснение большое спасибо.

И все же, есть ли разница в АС2 (именно в нем) между тем или иным способом.

П.С. Я пишу на php,но всегда писал процедурно.

chingachgoog 03.04.2008 11:33

Цитата:

Сообщение от ra26info
..из поста chingachgoog я понял что прототип, это ссылка на функцию

Нет-нет. Почитайте еще раз и внимательно. Просмотрите код, что я написал. На самом деле все крайне просто, но не сразу укладывается в голове. Надо посидеть и разобраться.
Прототип - это объект в таком специфическом объекте, как функция.
Т.е. это не ссылка на функцию.

ссылка на функцию - это ссылка в объекте под именем constructor
Код:

function Class(){
        this.p=this.p==undefined?0:++this.p
}

d=new Class()
trace(d.p) // выводит 0
trace(d.constructor==Class) // выводит true
d.constructor()
trace(d.p) // выводит 1
trace(Class.constructor==Function) // выводит true

Цитата:

Сообщение от ra26info
И все же, есть ли разница в АС2 (именно в нем) между тем или иным способом.

Для начала надо понять, в чем разница между AS1 и AS2.
Далеко не для всех это ясно.


Часовой пояс GMT +4, время: 13:22.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.