Pull to refresh

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

Reading time3 min
Views1.7K
Недокументированные возможности 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))
Tags:
Hubs:
Total votes 12: ↑3 and ↓9-6
Comments11

Articles