![]() |
Разница между "obj['s']" = и "obj.s ="
Есть ли разница в том, как указывать свойства объектам (динамически).
Так Код:
var worker:Object = {};Код:
worker.age = 15; |
Разница только в скорости доступа-создания.
|
Цитата:
Цитата:
|
Привет!
var o:Object = new Object() идентично var o:Object = {}. Скорость создания - одинаковая. worker["age"] = 15 идентично worker.age = 15. Скорость доступа - одинаковая. Только есть отличие: при помощи квадратных скобок можна формировать свойство на "лету". Например: worker["age"+8] = 15, что эквивалентно worker.age8 = 15. Но если написать: worker.age+8 = 15 - будет ошибка |
Цитата:
Код AS3:
Добавлено через 54 секунды Цитата:
|
Цитата:
Добавлено через 2 минуты Код AS3:
Код AS3:
|
Спасибо за ответы.
serogah, привет) worker["age"+8] = 15, что эквивалентно worker.age8 = 15. Вот это очень интересная вещь) Не знал)Часто необходимо бывает динамически создавать объекты(неопределенное количество), и в таком случае для доступа к ним приходится пихать их в коллекцию, а оттуда их уже по индексу выдергивать. А тут, грубо говоря, можно будет динамически каждому объекту раздавать id: Код:
for (i;i<n;i++){worker["age"+i]} |
на миллионе итераций проверьте
|
Код AS3:
Трейсы выдали: 1000, 621, 242, 362 соответственно. |
Цитата:
|
Цитата:
А почему тогда рекомендуется использовать {}, как писал udaaff. |
Смысл не в скорости, т.как по скорости нужно оптимизировать, когда это критично. Смысл в том, что когда вы компилируете X.Y - компилятор проверит, и выдаст ошибку, если у объекта X нет свойства Y. А когда вы X[Y] - это называется reflection - т.е. вы используете возможность среды выполнения найти по заданному строковому ключу свойство объекта. Естесственно, это будет не надежно (т.как вы можете сделать ошибку в имени свойства, т.как кто-то может после компиляции переиначить таблицу символов - место в котором среда выполнения будет искать соответствие ключа и свойства), ну и понятное дело, будет медленнее, т.как, даже не смотря на то, что флешевый компилятор - не оптимизирующий, при создании имен во время компиляции он может использовать более или менее жесткие правила. Менее жесткие правила требуют впоследствие от среды выполнения больше работы для нахождения свойства.
|
Код AS3:
|
Цитата:
|
Цитата:
Код AS3:
|
gloomyBrain, да, undefined, просто сказал по памяти. Но суть не в этом, суть в том, что ошибок не выдает на этапе компилирования. Только при попытке дальнейшего обращения к этому свойству.
|
Ну так это вообще разные вещи... есть доступ к элементам массива или хеш, а есть обращение к свойствам. Когда вы обращаетесь к строковому хешу то, скорее всего, происходит следующее (так это происходит в других языках, как именно это происходит в AS3 - я не знаю, но вряд ли отличается):
Используя простой алгоритм хеширования из строкового ключа создается числовой индекс (обычно 0..2^16) и в массив по этому индексу заносится ссылка на объект, который есть значение пары ключ-значение. Когда вы используете синтаксис с точкой, то компилятор может быть уверен, что у него есть полная строка, и он может элементарно заменить ее на переход по индексу. Когда вы используете квадратные скобки, то у компилятора такой уверенности быть не может, и он оставит процедуру создания индекса рантайму. Естесственно, что второй вариант будет дольше. Но, опять же, это не доступ к свойству, они просто одинаково записываются в AS3, но свойства - это квалифицированые имена, и они не обязаны вообще привязываться к каким-то строкам, в то время как строковой хеш, естесствено, обязан использовать строки. |
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
|
Цитата:
Мы работаем с ООП. |
Цитата:
Спрошу проще. Вы предлагаете нарушить стайлгайд. Зачем? P.S. Нет нужды объяснять, что такое стайлгайд и зачем его соблюдать? |
Цитата:
И это не единственный спорный пункт из этого гайдлайна (который, кстати, конкретно предназначен для писанины под Flex). Вы можете не иметь собственного мнения и юзать этот гайдлайн, как хотите. |
Я всегда пишу {} и []. Это более краткая запись, что удобно и мне не нравится перспектива писать то [], то new Array, размышляя, критический этот участок или нет. Я за единообразие.
|
Цитата:
|
Цитата:
|
В коде еще есть цифры и строки, и живут же без new как-то. Если есть литерал, то пользуемся литералом.
|
Цифры и строки не предполагают конструктора, ибо они - значения.
|
Цитата:
Цитата:
Цитата:
Цитата:
Разумеется, следовать своему примеру не заставляю. Со временем само придет. Может быть. Добавлено через 1 минуту Цитата:
|
Код AS3:
|
Цитата:
|
Цитата:
з. Ы. Я надеюсь, вы также переносите открывающую фигурную скобку, по конвенции Адоби. |
Цитата:
Код AS3:
|
Цитата:
|
Цитата:
|
Цитата:
Код:
Integer foo = 10; |
| Часовой пояс GMT +4, время: 11:42. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.