Недокументированные возможности ActionScript 1.0/2.0. Часть 1.

Недокументированные возможности ActionScript интересны всем. Рассмотрим недокументированную область видимости _global.

Нередко для решения какой-то важной задачи требуется перебрать свойства объекта. Допустим, вы хотите вывести значения свойств на панели Output для получения отладочной информации. Другой пример — декодирование неизвестных свойств объекта, возвращенного, скажем, при обращении к базе данных на сервере. Естественно, нам хотелось бы перебрать скрытые (недокументированные) свойства ActionScript и посмотреть, не найдется ли в них чего-нибудь интересного.

С точки зрения интерпретатора Flash базовый цикл ActionScript for..in означает следующее: «Взять указанный объект и для каждого из его свойств (включая методы, хранящиеся в свойствах) выполнить тело цикла». Тем не менее, многие встроенные методы и свойства ActionScript по умолчанию исключаются из перебора в цикле for..in. Предполагается, что программиста интересуют объекты и свойства, созданные им в программе, а не те, которые заложены в основу работы ActionScript, поэтому встроенные свойства исключаются из перебора for..in. Недокументированная функция ASSetPropFlags() позволяет сделать видимыми даже те свойства и методы, которые обычно остаются невидимыми для перебора.

Как нетрудно догадаться по ее имени, функция ASSetPropFlags() позволяет задавать флаги защиты свойств из ActionScript. Флаги указывают Flash Player, должны ли соответствующие методы и свойства включаться в перебор for.in. Функция ASSetPropFlags() также позволяет запретить запись (или перебор) свойств и методов пользовательских объектов, чтобы предотвратить их случайную модификацию. Это особенно актуально для глобальных свойств распространяемых компонентов, чтобы предотвратить конфликты со сторонними компонентами, используемыми в том же SWF-файле.

Давайте в общих чертах посмотрим, как же работает функция ASSetPropFlags().
Синтаксис вызова ASSetPropFlags():
ASSetPropFlаgs(объект, cвойства, маскаТrие, мacкaFalse)
где:
объект — объект или область видимости;
свойства — свойства/методы объекта, для которых вы собираетесь изменить
флаги защиты. Специальный аргумент null означает «все свойства»;
маскаТrие — целочисленная битовая маска, определяющая флаги конфигурации. Значимыми являются три последних бита целого числа, представляющие (справа налево) флаги «защиты от перезаписи», «защиты от удаления» и «скрытия». Например, двоичное значение 11О (06 в шестнадцатеричной записи, 6 в десятичной) защищает свойства, заданные вторым параметром, от записи и удаления, но перестает скрывать их при переборе;
мacкaFalse — другая целочисленная битовая маска, которая работает аналогично маскеТrие, но сбрасывает заданные флаги. мacкaFalse применяется до применения маскиТrие.

На странице FlashCodersWild (http://chattyfig.figleaf.com/flashcoders-wiki/?AssetPropFlags) меется диаграмма с описанием различных битовых масок, используемых функцией ASSetPropFlags().
Свойства/методы, которые мы хотим сделать видимыми, принадлежат к области видимости _global, содержащей все встроенные классы ActionScript. Таким образом, после выполнения следующей команды все классы ActionScript становятся полностью доступными для перебора:
ASSetPropFlags(_global. null. 6. 1);
Следующий фрагмент выводит список всех классов, найденных в открытой области видимости:

// Установить флаги защиты в _global равными 110(дв.), чтобы сделать их доступными для перебора
ASSetPropFlags(_global. null. 6. 1);

// Составление списка объектов в _global
for (thisObject in _global) {
 trace(thisObject);
}

Чтобы узнать, есть ли в этих классах что-нибудь интересное, мы последовательно переберем все их свойства. Если при поиске обнаружится свойство prototype, в котором хранятся методы и свойства класса (в ActionScript 1.0 и 2.0), мы переберем его содержимое:

// Установить флаги защиты в _global равными 110(дв.), чтобы сделать их доступными для перебора
ASSetPropFlags(_global, null, 6, 1);
// Составление списка объектов в _global
for (thisObject in _global) {
  ASSetPropFlags(_global[thisObject], null, 6, 1);
 
  trace("\n" + thisObject);
  for (props in _global[thisObject]) {
    trace(" " + props);

// Вывод содержимого prototype,
    if (props == «prototype») {
      ASSetPropFlags(_global[thisObject].prototype, null, 6, 1);
      for (protoChain in _global[thisObject].prototype) {
        trace(" " + protoChain);
      }
    }
  }
}


Если присоединить этот код к кадру 1 и протестировать ролик в Flash MX 2004, он
выведет длинный список документированных классов с методами и свойствами.

Перевод (FLASH HACKS (O'Reily))
–6
5 февраля 2007, 15:46
Afflictio 8,5

комментарии (11)

0
XEK #
за что -5? хорошая статья, спасибо будем юзать.
0
lol #
-10
1)Актуальность книги - 0. Была издана 2-3 года назад.
2)Актуальнсть перевода - 0. Книга переведена и издана на русском.
3)prototype, ASSetPropFlags - актуальность -10 (минус десять).
+1
Afflictio #
1) Актуальность не определяется, когда была издана книга (как может быть изданна книга 2-3 года назад если Flash 2004 вышел только 2 года назад + время написать книгу).
2) Не каждому хочеться чиатть целую книгу ради чего то одного, книга в бумажном варианте, книги под рукой нету и не видел.
3) ???
+1
lol #
Книга издана в июне 2004 года - http://www.oreillynet.com/catalog/flashh…
И следовательно писалась примерно в конце 2003 года. Сейчас слава богу февраль 2007 - в ActionScript другая геологическая эпоха.

Писать в феврале 2007 года про prototype, ASSetPropFlags - это тоже самое, если сейчас выложить "откровения" по испльзованию табличной вёрстки или написать большую статью об оптимизации сайта под Netscape 4.0

Под рукой полно.
Глава 9
Быстродействие и оптимизация
Трюки № 65–73
http://opensource.com.ua/contents/978546…

Flash.Трюки: Перевод с английского.
Авторы: Бхангал Ш.
Издательство: Питер
Год выпуска: 2005

А зесь можешь заказать-купить
http://www.piter.com/book/978546900763/
http://books.infolex.ee/book.php?t=17317…
0
Afflictio #
Не могу согласиться с тем, что "февраль 2007 - в ActionScript другая геологическая эпоха.". До сих пор большенство Flash приложений пишутся под 6-7 версии плееров (исключения составляют концептуально новые приложения во flash - которые нельзя реализовать в предыдущих версиях). Все остается актуальным до того времени пока им пользуються.

С вашей точки зрения можно сказать, что AS 2.0 уже вымер и стоит говорить сейчас только про 3.0.

"Писать в феврале 2007 года про prototype, ASSetPropFlags - это тоже самое, если сейчас выложить "откровения" по испльзованию табличной вёрстки или написать большую статью об оптимизации сайта под Netscape 4.0" - и до сих пор находяться заказчики которые требуют условия написания страниц поддерживающие Netscape 4.0.
0
Fireangel #
Писать про AS 1.0 или 2.0 станет неактуально тогда, когда у всех принудительно автоматом скачается 9й плеер и повсеместно будет использоваться AS 3.0. Так что по мне - статья принесет пользу своему читателю. Потому что большинство людей, изучающих flash пока еще юзает AS2 и не настолько хорошо, чтобы пропускать эту статью за ненадобностью.
–1
lol #
Я разве где-нибудь сказал "AS 2.0 уже вымер"?
Я разве где-нибудь сказал "никто не пишет на AS1 и AS2"?

AS2 достаточно востребован.

Некоторые даже ещё и так пишут
on (press) {
startDrag(this);
}
on (release) {
stopDrag();
}

Ну и пусть пишут... Но лучше никому такой код не показывать, прятать его подальше, как, например, пенис длиной 3 сантиметра...

ИМХО - обсуждение этих тем (prototype, ASSetPropFlags, AS 1.0) - уже не актуально. И даже вредно. Да был у ActionScript период полового созревания - теперь всё, что надо развилось и выросло. И им нужно пользоваться. По назначению. А не обсуждать эти детские грешки с prototype-ами...

Если серьёзно - трудно будет переучиваться, отвыкать от от уловок и плясок с бубном...

Если же для кого-то интересно про палки-копалки - на здоровье - я дал ссылки.
0
Afflictio #
Объясните тогда пожалуйста, почему макромедия даже в 8 плеере классы (проверял филтры например) написанны на прототипах.
ASSetPropFlags - в данном случае можно протрейсить все скрытые свойства всех новых классов.

Никак не могу понять, почему не актуально?
0
Afflictio #
Опечатался - в 8 не плеере, а в 8 Flash.
–1
lol #
Да пишите! используйте! просто обсуждение таких свежих тем придаёт этому ресурсу запах нафталина
0
entze #
Поддерживаю во всем вышесказанном вами.

Вообще помоему пора бы уже забить на Animations и использовать Flash как платформу. И готовится встретить Аполло, а не достойную старость придумывая 859 способ забавно анимировать буквы.

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.