![]() |
|
||||||||||
|
|||||
|
Регистрация: Jun 2011
Сообщений: 31
|
Думаю я далеко не первый кто такое спрашивает >_<
1) Нужно получить тип переменной(переменная еще не содержит значение) 2) Присвоить этой же переменной новое значение на основе полученного типа: Что было: var spr:Sprite; trace(typeof(spr)); // object var str:String; trace(typeof(str)); // string Как получить заветный тип? Ну и далее по пункту 2, как такое делается? |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Цитата:
но у меня вопрос, зачем создавать "пустую" переменную какого-то определенного типа? Последний раз редактировалось goodguy; 24.06.2011 в 21:16. |
|
|||||
|
Не надо сравнивать работу с классами и примитивными типами...
__________________
RTFM |
|
|||||
|
Регистрация: Mar 2007
Сообщений: 319
|
|
|
|||||
|
Регистрация: Jun 2011
Сообщений: 31
|
Представьте: Есть неск-ко функций, использующих определенный набор объектов(переменных). Функции связаны, управляющий элемент ходит туда-сюда по этим функциям. Внутри функций по мере надобности инициализируются некоторые из объектов(переменных):
function foo1(){ var1 = new var1Class(); var2 = new var2Class(); } function foo2(){ var2 = new var2Class(); } Вот на этом месте я задал себе вопрос - я что в каждой подобной foo№() должен такие проверки проводить? Не красиво и громоздко получается. Ладно, если будет одна точка входа в систему функций, там получится, что в любой момент времени известно, какие объекты созданы, и можно ручками написать такие проверки, сведя их к минимуму. А если точек входа несколько? Цитата:
Тут конечно можно сказать, мол сразу давай всем своим переменным значения и не мучайся. Но зачем мне иметь эти переменные тогда, когда они фактические еще нигде не используются? Вот и чтобы избавится от копипаста одинаковых проверок, решено было вынести подобный алгоритм в отдельную функцию, которая(спасибо за инфу о нужных функциях) примерно выглядит вот так: function checkObj(...objs):void { for(var i:int = 0; i < objs.length; i++) { if(!objs[i]) { assetClass = getDefinitionByName(getQualifiedClassName(obj[i])) as Class; objs[i] = new assetClass(); } } } import flash.display.Sprite; var assetClass:Class; var spr1:Sprite = new Sprite(); var spr2:Sprite; assetClass = getDefinitionByName(getQualifiedClassName(spr1)) as Class; trace(assetClass); // [class Sprite] // А если так: assetClass = getDefinitionByName(getQualifiedClassName(spr2)) as Class; // ReferenceError: Error #1065: Переменная null не определена. |
|
|||||
|
Регистрация: Mar 2008
Сообщений: 215
|
У вас код
компилируется?
Смотрите, что вы делаете: вначале пишете . То есть objs[i] у вас, скорее всего, null (раз вы работаете с объектами). Потом вы передаете этот null в getQualifiedClassName. И что же вы хотите получить? Тем более вы не сможете инициализировать поле класса, так как не передаете в метод ссылку на него (а передаете вы null). Так что ваш подход реализовать невозможно таким способом. Меняйте логику работы. Например, напишите геттер и везде используйте его, а не поле класса: Но такой подход достаточно корявый, и лучше вам поменять логику работы приложения, чтобы не возникало описанной вами ситуации. |
|
|||||
|
Banned
[+1 05.11.11]
[+1 09.08.11] Регистрация: Jan 2010
Адрес: РФ. Кемеровская область
Сообщений: 3,243
|
Zolza, может я опять что-то не совсем так понял, но для таких целей в АС3 есть звездочка * (wildcard).
т.е., создаем переменную без типа: И, соответственно, можем в дальнейшем присвоить ей любой тип |
|
|||||
|
Вместо
проще использовать Но здесь это не поможет. Вообще, думаю, что подход неверен. Почитайте про пул объектов. Как раз то, что вам нужно.
__________________
9 из 10 голосов в моей голове сказали наркотикам "НЕТ" Мои ачивки: художник-паразит. |
![]() |
![]() |
Часовой пояс GMT +4, время: 21:52. |
|
|
« Предыдущая тема | Следующая тема » |
| Теги |
| typeof() , извлечение типа |
|
|