Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Поиск имени свойства у объекта (http://www.flasher.ru/forum/showthread.php?t=182360)

koIIImarik 20.07.2012 19:36

Поиск имени свойства у объекта
 
Всем привет.

Вот столкнулся с такой не самой тривиальной задачей:

1) Есть объект obj, у него есть свойство prop, к которому мы можем обратиться obj.prop.
2) Так как не хочется хардкодить название параметра в виде строки (чтобы потом можно было бы обратиться к нему), хотелось бы каким-то способом найти имя параметра, имея в исходных объект и ссылку на его свойство.

В идеале должен получиться некий метод:

Код AS3:

/**
 * Поиск имени свойства по ссылке на объект и по ссылке на свойство.
 *
 * @param        sourceObject объект.
 * @param        sourceProp свойство, название которого нужно найти.
 *
 * @return        название свойства.
 */

function findPropNameInObject(sourceObject:Object, sourceProp:Object):String
{
  // Тут происходит магия
}

Варианты решения, которые мне приходят в голову:

1) Перебирать все названия свойств объекта через for in цикл, на каждом шаге сравнивая строгим сравнением (===) значения внутри объекта, по перебираемому ключу и искомым свойством. Данный метод хорошо подходит для объектов, у которых все свойства можно перебрать через цикл, но не подойдёт для стандартных классов с public переменными, которые не были объявлены для перебирания.

2) Хард-кор-стайл-метод: создать массив с символами всего латинского алфавита и цифрами. Запустить долгий-долгий цикл, который на каждом шаге будет пытаться "подобрать" имя свойства у объекта, через hasOwnProperty можно проверять наличие свойства с таким именем у объекта, и если свойство есть, сравнивать полученное значение через строгое сравнение с искомым параметром.

По очевидным причинам второй метод - не айс (может долго искать, может повесить приложение, если добавить ограничение на количество шагов поиска, то не всегда будет находить результат, есть ограничения к названию искомого параметра (только латиница и только цифры)).

Было бы клёво, если бы кому-нибудь пришло в голову более правильное решение, чем те, которые пришли в голову мне.

P.S.:
Изначально задумался о такой штуке, чтобы "обезопасить" биндинг в AS3 (когда он происходит с помощью "выдранной" библиотеки из Flex). Т.е. мне не нравится сам факт хардкода названий свойств, который нужен при биндинге изменения свойств с каким-то методом. При таком подходе, если где-то изменится имя свойства объекта, и мы забудем поменять все места, где у нас захардкожена строка с названием свойства, то приложение в момент исполнения бросит эксепшн, когда биндинг-метод попробует забиндиться у объекта на свойство, которое не будет найдено по строке.

Inet_PC 20.07.2012 22:41

Перебрать все свойства объекта можно с помощью describeType. Но как Вы будите угадывать, что это именно то свойство (для простых типов например).
Цитата:

Изначально задумался о такой штуке, чтобы "обезопасить" биндинг в AS3 (когда он происходит с помощью "выдранной" библиотеки из Flex). Т.е. мне не нравится сам факт хардкода названий свойств, который нужен при биндинге изменения свойств с каким-то методом. При таком подходе, если где-то изменится имя свойства объекта, и мы забудем поменять все места, где у нас захардкожена строка с названием свойства, то приложение в момент исполнения бросит эксепшн, когда биндинг-метод попробует забиндиться у объекта на свойство, которое не будет найдено по строке.
Используйте статические константы, уж поменять название свойства и одну константу не так сложно же?
Возможно кусочек кода прояснил бы ситуацию. Зачем вооще "выдирать" биндинг, когда его можно преспокойно использовать легально (вот тут я отписывался в коментах).


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

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