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