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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 20.07.2012, 19:36
koIIImarik вне форума Посмотреть профиль Отправить личное сообщение для koIIImarik Посетить домашнюю страницу koIIImarik Найти все сообщения от koIIImarik
  № 1  
Ответить с цитированием
koIIImarik
 
Аватар для koIIImarik

Регистрация: Jul 2007
Адрес: Россия, Москва
Сообщений: 522
Question Поиск имени свойства у объекта

Всем привет.

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

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). Т.е. мне не нравится сам факт хардкода названий свойств, который нужен при биндинге изменения свойств с каким-то методом. При таком подходе, если где-то изменится имя свойства объекта, и мы забудем поменять все места, где у нас захардкожена строка с названием свойства, то приложение в момент исполнения бросит эксепшн, когда биндинг-метод попробует забиндиться у объекта на свойство, которое не будет найдено по строке.

Старый 20.07.2012, 22:41
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 2  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
Перебрать все свойства объекта можно с помощью describeType. Но как Вы будите угадывать, что это именно то свойство (для простых типов например).
Цитата:
Изначально задумался о такой штуке, чтобы "обезопасить" биндинг в AS3 (когда он происходит с помощью "выдранной" библиотеки из Flex). Т.е. мне не нравится сам факт хардкода названий свойств, который нужен при биндинге изменения свойств с каким-то методом. При таком подходе, если где-то изменится имя свойства объекта, и мы забудем поменять все места, где у нас захардкожена строка с названием свойства, то приложение в момент исполнения бросит эксепшн, когда биндинг-метод попробует забиндиться у объекта на свойство, которое не будет найдено по строке.
Используйте статические константы, уж поменять название свойства и одну константу не так сложно же?
Возможно кусочек кода прояснил бы ситуацию. Зачем вооще "выдирать" биндинг, когда его можно преспокойно использовать легально (вот тут я отписывался в коментах).
__________________
http://www.chessmax.ru

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

Теги
Биндинг , название , поиск , свойства , Только-хард-кор

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

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


 


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


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