Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.11.2012, 17:18
SmartFox вне форума Посмотреть профиль Отправить личное сообщение для SmartFox Найти все сообщения от SmartFox
  № 1  
Ответить с цитированием
SmartFox

Регистрация: Jun 2010
Сообщений: 22
По умолчанию Конструктор главного класса приложения

Всем доброго времени суток!

Я заметил, что во многих туториалах по AS3 избегают проводить всю необходимую инициализацию
в конструкторе главного класса приложения. Вместо этого создают отдельную функцию и вызывают
ее по наступлению события ADDED_TO_STAGE. Почему?

Flash Develop вообще по-умолчанию генерирует такой код:
Код AS3:
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
Т.е., как я понимаю, объект stage может еще не существовать к моменту создания объекта нашего класса?
Я всегда всю инициализации проводил в конструкторе и проблем не было...

Старый 22.11.2012, 17:23
КорДум вне форума Посмотреть профиль Отправить личное сообщение для КорДум Найти все сообщения от КорДум
  № 2  
Ответить с цитированием
КорДум
 
Аватар для КорДум

блогер
Регистрация: Jan 2008
Адрес: syktyvkar
Сообщений: 3,803
Записей в блоге: 10
Цитата:
Т.е., как я понимаю, объект stage может еще не существовать к моменту создания объекта нашего класса?
Когда флешка загружается в другую, stage у нее не доступен сразу.

Цитата:
Я всегда всю инициализации проводил в конструкторе
Код в конструкторе интерпретируется FP каждый раз, когда его вызов встречается в коде, вместо того, чтобы кэшировать в памяти все интерпретированное, что происходит с методами, например. Поэтому тратится больше времени на вызов конструктора.
__________________
тут я

Старый 22.11.2012, 17:32
SmartFox вне форума Посмотреть профиль Отправить личное сообщение для SmartFox Найти все сообщения от SmartFox
  № 3  
Ответить с цитированием
SmartFox

Регистрация: Jun 2010
Сообщений: 22
Цитата:
Сообщение от КорДум Посмотреть сообщение
Когда флешка загружается в другую, stage у нее не доступен сразу.
Мм... т.е. если я не использую обращение к stage в коде инициализации или если я не планирую
загружать данную флешку внутрь другой, то можно всю инициализацию в конструктор пихать?

Цитата:
Сообщение от КорДум Посмотреть сообщение
Код в конструкторе интерпретируется FP каждый раз, когда его вызов встречается в коде, вместо того, чтобы кэшировать в памяти все интерпретированное
Но встречается-то он всего один раз! Это же основной класс и создается всего один его объект.

Старый 22.11.2012, 17:36
Zebestov вне форума Посмотреть профиль Отправить личное сообщение для Zebestov Посетить домашнюю страницу Zebestov Найти все сообщения от Zebestov
  № 4  
Ответить с цитированием
Zebestov
Lorem ipsum
 
Аватар для Zebestov

модератор форума
Регистрация: May 2001
Адрес: Одесса
Сообщений: 4,869
Записей в блоге: 4
Если ты не планируешь проверять наличие stage в конструкторе с последующим алертом типа "ай-ай-ай!!!", то можно опустить этот блок и производить инициализацию прямо в конструкторе. Главное не отвыкнуть от хорошего и не делать так в других классах отображения.
__________________
Поймай яблоко 2!

Старый 22.11.2012, 17:37
SmartFox вне форума Посмотреть профиль Отправить личное сообщение для SmartFox Найти все сообщения от SmartFox
  № 5  
Ответить с цитированием
SmartFox

Регистрация: Jun 2010
Сообщений: 22
Понятно. Спасибо.

Правильно ли я понял, что лучше вообще всю инициализацию из конструкторов выносить,
потому что их код не кешируется?

т.е. всегда лучше написать покрайней мере так:
Код AS3:
public function ClassName () : void
{
    init ();
}
 
private function init () { /*initialization*/ }
И это будет быстрее если объекты класс ClassName создаются регулярно в процессе выполнения?

Старый 22.11.2012, 17:49
illuzor вне форума Посмотреть профиль Отправить личное сообщение для illuzor Найти все сообщения от illuzor
  № 6  
Ответить с цитированием
illuzor
 
Аватар для illuzor

Регистрация: Dec 2010
Адрес: Ярославль
Сообщений: 1,255
SmartFox, вы не уловили суть. Нужно убедиться, что stage доступен и уже после этого запускать основной код.

Старый 22.11.2012, 17:53
SmartFox вне форума Посмотреть профиль Отправить личное сообщение для SmartFox Найти все сообщения от SmartFox
  № 7  
Ответить с цитированием
SmartFox

Регистрация: Jun 2010
Сообщений: 22
Цитата:
Сообщение от illuzor Посмотреть сообщение
SmartFox, вы не уловили суть. Нужно убедиться, что stage доступен и уже после этого запускать основной код.
Об этом я как раз догадался по строке if (stage) init(); в коде из Flash Develop. Просто меню удивило, что среда выполнения может создать объект моего класса до того, как создала stage. Оказывается может.

Старый 22.11.2012, 18:08
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 8  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
прошу не путать грешное с праведным.

Стейдж экземпляр получает тогда когда добавлен на сцену. если быть точным после выполнения комманды
Код AS3:
addChild();
__________________
return this...

Старый 22.11.2012, 18:10
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 9  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
AlexCooper. Есть частный случай. В primary документ-классе, который является корневым, stage доступен в конструкторе.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 22.11.2012, 18:12
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 10  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Пример

Код AS3:
var test = new inits();
trace(test.DATA); // 0
addChild(test);
trace(test.DATA); // 1
Код AS3:
package  {
 
	public class inits {
 
		public var DATA:Number = 0;
 
		public function inits() {
			if (stage) init()
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event):void {
			DATA = 1;
			removeEventListener(Event.ADDED_TO_STAGE, init);
		}
 
	}
 
}
Добавлено через 1 минуту
Цитата:
Сообщение от dimarik Посмотреть сообщение
AlexCooper. Есть частный случай. В primary документ-классе, который является корневым, stage доступен в конструкторе.
C этим согласен, так как корневой "Main" сам себя добавляет на сцену и ему не нужен
Код AS3:
addChild()
__________________
return this...

Создать новую тему Ответ Часовой пояс GMT +4, время: 01:01.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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