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