![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 80
|
Есть строчка
Мне нужно динамически менять цифры 6 и 3, какой способ наиболее лучше или может они оба устарели и вы сможете посоветовать более современный. |
|
|||||
|
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
|
Лучше закэшировать значения и обращаться по ссылке.
Если будет много клипов, то тогда уже в цикле прогонять или с массивами помудрить нужно будет. Но очевидно, что постоянно (не однократно) пользоваться динамическим доступом - зло. Из ваших вариантов выбрал бы первый.
__________________
hauts.ru |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 80
|
А можете подробнее про злые ситуации написать. В чём может быть злоупотребление и чем это грозит.
|
|
|||||
|
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
|
В большинстве случаев это просто для удобства. Ну а вообще динамический доступ, да и вообще обращение к чему-либо через точку (точка - это тоже оператор) затребует больше ресурсов, чем обращение к заранее закэшированым ссылкам.
Для наглядного примера можете такое у себя попробовать: var a = {}; a.b = {}; a.b.c = {}; a.b.c.d = {}; a.b.c.d.e = {}; a.b.c.d.e.f = {}; a.b.c.d.e.f.someProp = 15; var t = getTimer(); var s = 0 for (var k = 0; k < 1000000; k++) { s += a.b.c.d.e.f.someProp; } trace(getTimer() - t) // 4041 var t = getTimer(); var s = 0 var q = a.b.c.d.e.f for (var k = 0; k < 1000000; k++) { s += q.someProp; } trace(getTimer() - t) // 3061 ![]() Еще можно ссылки на клипы не просто перечислением var clip_1 = ... создавайть, а, например, в массив загонять для удобства. Иными словами, чем больше операций происходит для доступа к камому-либо полю, тем хуже.
__________________
hauts.ru Последний раз редактировалось Hauts; 21.06.2012 в 17:19. |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 80
|
Тест дал:
2990 и 2305 Могли бы подсказать, что значат фигурные скобки после = ? И немножко подробнее скрипт расписать. Мы в первом таймере один миллион переменных присваиваем?)))))) Последний раз редактировалось dkart01; 21.06.2012 в 19:09. |
|
|||||
|
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
|
dkart01, фигурные скобки — это новый объект. То есть можно написать "{}", а можно и "new Object()". Аналогично можно и с массивами — вместо "new Array()" писать "[]".
В приведеном коде я создаю структуру, — у объекта "a" есть свойтво "b", тоже объект. У которого, в свою очередь, есть войство "c", которое тоже является объектом и т.д. И в итоге у свойства "f" (объекта) я создаю поле "someProp", равное 15. Далее для теста я записываю в переменную t текущее значение таймера (таймер в миллисекундах и считается от начала запуска флэшки). Потом в цикле от 0 до 1000000 (миллион итераций) я прибавляю к переменной "s" значение "someProp" у объекта "f", при этом осуществляя прямой доступ к этому значение, то есть по "a.b.c.d.e.f.someProp". После выполнения цикла вывожу разницу между текущим значением таймера и тем, что я записал еще до начала цикла. Таким образом я получаю время в миллисекундах, потраченое на выполнение этого кусочка кода. Аналогично и во втором тесте, только там я предварительно закэшировал структуру объектов в отдельную ссылку "q" и в цикле уже обращаюсь через "q.someProp". Разница в значениях потраченого времени из-за того, что в первом случае используется прямой доступ, а во втором — по ссылке. Если написать третий тест еще и с динамическим доступом, то его результаты будут самыми плохими.
__________________
hauts.ru |
|
|||||
|
Регистрация: Apr 2012
Сообщений: 80
|
Здорово. Очень хороший пример!
Можно попросить вас помочь с объектами (пример ниже). Один из случаев применения - кэширование, а какие еще могут быть применения таким объектам? Мувиклип - частный случай объекта? Последний раз редактировалось dkart01; 22.06.2012 в 11:11. |
|
|||||
|
блогер
Регистрация: Feb 2008
Адрес: Россия, Новосибирск, Академгородок
Сообщений: 2,113
Записей в блоге: 1
|
Хм. Считайте, что объект (new Object() я имею в виду) — это просто хранилище для свойств и методов. Мувиклип — это тоже объект, только визуальный. Меняя свойство "_x" у объекта-мувиклипа, вы увидете изменение положения графики на экране. Вообще все в экшенскрипте основывается на объектах.
Применений множество для объектов. Я только некоторые случаи могу привести, которые сходу на ум приходят. 1. Использование объекта в качестве аргумента для функции в случае, если количество необходимых аргументов непредсказуемо: function generateSomeStroke(o) { var returnStroke = ""; for (var i in o) { returnStroke += i + "=" + o[i] + "&"; } return returnStroke.substr(0,-1) } var myObject = {}; myObject.param_1 = "hello!"; myObject.param_2 = 10; myObject.param_3 = true; myObject.param_4 = {}; trace(generateSomeStroke(myObject)); var data = {}; for(var k = 0; k < 100; k++){ data["someFieldName_" + k] = {someProp: k + 10} } Так же можно перебирать все свойства объекта в цикле: function traceObject(o){ for(var i in o){ trace(i + " = " + o[i]); } } var myObject = {} myObject.param_1 = "hello!"; myObject.param_2 = 10; myObject.param_3 = true; myObject.param_4 = {}; traceObject(myObject); Добавлено через 2 минуты Сначала вы создаете объект "e" — a.b.c.d.e = {};, а потом переписываете его значением "3" (числом). Далее вы уже у числа 3 пытаетесь создать свойство "f", но такого не получится, у числел нельзя свойства создавать. Соответственно f и f.someProp не будут существовать.
__________________
hauts.ru |
![]() |
![]() |
Часовой пояс GMT +4, время: 17:32. |
|
|
« Предыдущая тема | Следующая тема » |
|
|