Просмотр полной версии : преобразование текста в объект.
Как можно (и можно ли) преобразовать текст в объект?
Например:
Есть объект DinamicText c именем "MyText1".
Есть текстовая переменная MyName.
Можно ли сделать типа такого:
var MyName = "MyText1";
MyObj = MyName; // ???
MyObj.text = "Мой текст";
MyObj._x = 100;
Т.е. в текстовую переменную заношу имя реального объекта,
а потом с ним делаю что мне нужно.
Может есть другой вариант?
Мне нужно, чтобы можно было работать только с одним объектом (MyObj),
название которого я беру из текстовой переменной MyName.
а вдруг не this а _level0.mamaDorogaya.rodiMenyaObratno ?
тогда беда.. :)
или _level0.mamaDorogaya.rodiMenyaObratno[MyName]
зы: к eval сложилось какое-то негативное отношение, почему, правда, не могу до сих пор понять..
ивал это деректива компилятора, которая зверски все это дело тормозит.
вобщем ее лучше не юзать если не припрет.
хотелось все же понять какое дело директива компилятора может зверски тормозить
к слову, тесты показывают примерно одинаковую скорость доступа через eval и []
this.createEmptyMovieClip("myMc",0)
for(var i=10000,t=getTimer();i--; )eval("myMc").x=i;
trace(getTimer()-t);//100,103,99
for(var i=10000,t=getTimer();i--; )this["myMc"].x=i;
trace(getTimer()-t);//106,108,107
я на паре сайтов, видел бенчмарки где ивал уступал, но сам не проводил, вроде одна статья даже на русском была
а насчет деректива и тормоза, я не строил цепочек, наверное не так высказался, просто использовать дерективы в рантайме, кажеться чуть чуть извратом.
ивал это деректива компилятора, которая зверски все это дело тормозит.
вобщем ее лучше не юзать если не припрет.
У Гурского с точностью до наоборот:
"Выигрыш в производительности можно получить, если использовать для переопределения переменных и свойств предложение set, а для чтения их значений – функцию eval()...."
О вспомнил где статью на русском видел
http://www.initclip.com/articles/0000004/
Самый громоздкий доступ выполняется через команду "eval()". Эта функция позволяет на лету по строковому имени создавать доступ к любым переменным (объектам, клипам и т.д.), что требует достаточно много времени. Поэтому даже самый оптимально написанный код с eval() всегда будет около двух раз уступать по производительности доступу через массив или точку, поэтому последний хорошая ему альтернатива. Это относится и для применения команд set, get, setProperty, getProperty - выполнение которых занимает довольно много времени. В связи с этим рекомендуется отказаться или максимально ограничить использование таких функций в коде и пользоваться исключительно доступом через точку.
и в догонку
Доступ через массив - _root["test_mc"], равнозначен "dot"-нотации по скорости выполнения.
О вспомнил где статью на русском видел
http://www.initclip.com/articles/0000004/
Ну и почитал бы комментарии к этой статье ......
Аргументы Гурского более чем убедительны -
Например, следующая строчка
set(clip1.clip2.clip3.prop, “Привет”);
будет скомпилирована в 2 команды Flash-ассемблера:
push 'clip1.clip2.clip3.a', 'Привет'
setVariable
Если использовать операторы доступа к свойствам
clip1.clip2.clip3.a="Привет";
то команд будет целых 8:
push 'clip1'
getVariable
push 'clip2'
getMember
push 'clip3'
getMember
push 'a', 'Привет‚'
setMember
года два назад тестировал производителность и через точку было медленнее, не давно тоже видел статью где утверждалось обратное, я очень удивился и полез проверять снова...результат тот же.
ЗЫ: эту же статью и читал :p
скачал декомпилер, проверил стэк оригинально...
Вчера нашел такую вещь:
var MyName = "MyObject";
_root[MyName].text = "Мой текст";
(тоже самое предложил silin)
Меня это устраивает.
Всем большое спасибо!
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.