PDA

Просмотр полной версии : безопасное обращение к свойству объекта через QName.


incvizitor
12.11.2013, 12:35
Вообщем есть код:


public class Main extends Sprite{

test const foo:String = "fooConst";

public function Main() {
var qName : QName = new QName(test, "foo");
trace(this.hasOwnProperty(qName.toString()));
trace(qName in this);
}
}


Оба трейса вернут false.

Естественно можно через this[qName], но это черевато RTE в случае, если свойства не существует. Возможно ли разрулить эту ситуацию без try/catch ?

alatar
12.11.2013, 13:56
Оба трейса вернут false.
У вас qName локальная переменная, откуда ей взяться в this?

Добавлено через 44 секунды
P.S. qName.toString() (http://help.adobe.com/ru_RU/FlashPlatform/reference/actionscript/3/QName.html#toString()).

incvizitor
12.11.2013, 14:08
откуда ей взяться в this?

Ну this[qName] работает, если что. Но в случае если localName будет не "foo", а "foo1" - будет RTE.

ChuwY
12.11.2013, 16:38
С помощью describeType можно узнать список полей и посмотреть, есть ли там это.

incvizitor
12.11.2013, 16:49
ChuwY, что то подсказывает, что с describeType будет даже медленнее, чем обращения через try/catch.

ChuwY
12.11.2013, 17:43
Если его каждый раз вызывать заново, то да.
Если кешировать результаты различные, то, думаю, все же куда быстрее.
Еще можно посмотреть библиотеку по поводу рефлексии в as3commons.
Там, наверняка, по-умному все сделано.

incvizitor
13.11.2013, 02:25
таких библиотек много, но суть не в этом. Мне кажется, что должен быть способ без describeType. Надо ведь просто узнать есть такое свойство или его нету...

GBee
13.11.2013, 02:37
Надо ведь просто узнать есть такое свойство или его нету...
hasOwnProperty(propName) по идее хватит

ChuwY
13.11.2013, 13:39
Из-за кастомного неймспейса не работает.