|
|
|||||
Регистрация: Jul 2007
Адрес: Россия, Москва
Сообщений: 522
|
Поиск имени свойства у объекта
Всем привет.
Вот столкнулся с такой не самой тривиальной задачей: 1) Есть объект obj, у него есть свойство prop, к которому мы можем обратиться obj.prop. 2) Так как не хочется хардкодить название параметра в виде строки (чтобы потом можно было бы обратиться к нему), хотелось бы каким-то способом найти имя параметра, имея в исходных объект и ссылку на его свойство. В идеале должен получиться некий метод: /** * Поиск имени свойства по ссылке на объект и по ссылке на свойство. * * @param sourceObject объект. * @param sourceProp свойство, название которого нужно найти. * * @return название свойства. */ function findPropNameInObject(sourceObject:Object, sourceProp:Object):String { // Тут происходит магия } 1) Перебирать все названия свойств объекта через for in цикл, на каждом шаге сравнивая строгим сравнением (===) значения внутри объекта, по перебираемому ключу и искомым свойством. Данный метод хорошо подходит для объектов, у которых все свойства можно перебрать через цикл, но не подойдёт для стандартных классов с public переменными, которые не были объявлены для перебирания. 2) Хард-кор-стайл-метод: создать массив с символами всего латинского алфавита и цифрами. Запустить долгий-долгий цикл, который на каждом шаге будет пытаться "подобрать" имя свойства у объекта, через hasOwnProperty можно проверять наличие свойства с таким именем у объекта, и если свойство есть, сравнивать полученное значение через строгое сравнение с искомым параметром. По очевидным причинам второй метод - не айс (может долго искать, может повесить приложение, если добавить ограничение на количество шагов поиска, то не всегда будет находить результат, есть ограничения к названию искомого параметра (только латиница и только цифры)). Было бы клёво, если бы кому-нибудь пришло в голову более правильное решение, чем те, которые пришли в голову мне. P.S.: Изначально задумался о такой штуке, чтобы "обезопасить" биндинг в AS3 (когда он происходит с помощью "выдранной" библиотеки из Flex). Т.е. мне не нравится сам факт хардкода названий свойств, который нужен при биндинге изменения свойств с каким-то методом. При таком подходе, если где-то изменится имя свойства объекта, и мы забудем поменять все места, где у нас захардкожена строка с названием свойства, то приложение в момент исполнения бросит эксепшн, когда биндинг-метод попробует забиндиться у объекта на свойство, которое не будет найдено по строке. |
|
|||||
Перебрать все свойства объекта можно с помощью describeType. Но как Вы будите угадывать, что это именно то свойство (для простых типов например).
Цитата:
Возможно кусочек кода прояснил бы ситуацию. Зачем вооще "выдирать" биндинг, когда его можно преспокойно использовать легально (вот тут я отписывался в коментах).
__________________
http://www.chessmax.ru |
Часовой пояс GMT +4, время: 04:17. |
|
« Предыдущая тема | Следующая тема » |
Теги |
Биндинг , название , поиск , свойства , Только-хард-кор |
|
|