![]() |
Почему все свойства объекта получают тип "object" ?
Есть очень полезный и удобный метод, который на основании XML-а делает объект со свойствами
Код:
XML.prototype.toObject = function () {Код:
<?xml version="1.0" ?>Код:
xmltest.num; // = 500Код:
var a = xmltest.num + xmltest.txt.some; |
Код:
s = 5; |
непонятно почему из "n1 = new String (s)" получается тип object а не string ???
|
Код:
s = 5;Во втором приведением типов. Обычно, мы задаем строковой литерал, то есть Код:
str = "234"Код:
trace (str.length)PS. Поэтому все методы и свойства работают быстрее, если у нас объект String, а не литерал. Например length в 5 раз. |
Спасибо, это понял, но как это применить в моей функции не догоняю.
писал эту строку хоть так: t = new String (s.nodeValue); хоть так: t = String (s.nodeValue); хоть так: t = s.nodeValue; разницы никакой, все равно все свойства получают тип object. |
Я не понял как ваш метод применить.
Код:
XML.prototype.toObject = function () { |
Вот так:
Код:
s = '<?xml version="1.0" ?><xmltest><num>500</num><txt attributeExample="Node 2 attribute"><some>777</some><thing>qwerty</thing></txt></xmltest>'; |
А можно вопрос? Зачем объект преобразовывать в объект?
|
где ты это видишь?
Я из XML-объекта делаю обычный объект со свойствами, чтобы не плутать по XML-ю через childNodes, nodeName, nodeValue и др., а обращаться к нормальным свойствам нормального объекта. Кроме того, таким способом можно сразу существующему объекту поменять свойства или добавить новые. У меня это отлично работает в связке с сокет-сервером. |
Как это где вижу? XML — объект, им же и остался. А что будешь делать, когда у тебя будет два тега с одним именем?
|
нет, ты немного не понял.
В примере выше объект "х" - это xml-объект, в котором доступ к значениям осуществляется через nodeValue. Метод toObject возвращает стандартный флешовый объект с обычными свойствами/значениями, т.е. "x" и "xmlobj" - разные объекты по сути и по классам. В случае нескольких тегов с одинаковым именем, метод создаёт свойство-массив. Например: Код:
s = '<?xml version="1.0" ?> |
Нет, я все-равно не понимаю, зачем все эти преобразования и перемешивания данных? Облегчить жизнь? Скорее усложнить, о чем и свидетельствует эта тема…
|
Да, а как ты обратишься к значению узла <thing> вышепреведеного xml-a?
|
Изменил бы архитектуру таким образом, чтобы одному логическому элементу не пришлось бы обращаться глубже своих детей. Не говоря уже о том, что была бы четкая структура XML, с определенными правилами построения.
|
Цитата:
Код:
function getNode (node, name) { |
Ажно руки зачесались дописать книгу про XML.
Пара советов: - etc дело говорит: преобразовывать стандартный объект (XML) в нестандартный дело сомнительное. - чтобы достучаться до значения атрибута и получить его в нужном тебе типе, просто сделай методы конвертации/доступа. Поскольку расширить XMLNode своим классом нерентабельно, лучше юзать композицию. К примеру, желаем получить доступ к значению атрибута как к массиву: (пример не рабочий, просто как принцип) Код:
class XMLUtils {- разберись со своим стандартом XML, сделай правильную структуру. Работа с данными не должна быть в виде длинных иерархических обращений. Передавай узлы на обработку экземплярам, а не управляй ими централизованно. К примеру, у тебя на сцене несколько персонажей, привязанных к юзерам. Их состояние апдейтится из XML. Тогда лучше сделать XML вида: Код:
<state>Код:
private function onLoad (ok) {Код:
class UserClass {Резюмируем: - получили данные в приложение - в приложении раскидали по экземплярам - в экземплярах раскидали по обработчикам - в обработчиках проверили типы, привели к нужным - выполнили действия. код выше - не рабочий, просто иллюстрация. - оч тяжело писать код прямо здесь... три раза правил :) |
Да, обрати внимание, что нигде в коде не обращаемся к узлам - детям детей.
Исключение в onLoad, да и то потому, что this - пустой. Второе исключение я допускаю для текстовых узлов в обращениях вида: node.firstChild.nodeValue; все остальные случаи - признак неидеальной организации проекта :) |
жаль тут в мемориз низзя.
|
Цитата:
А если несколько нодов с одинаковым именем? |
Цитата:
|
Наши вопросы касаются совершенно разных кодов и подходов.
Я спрашивал по поводу кода, приведённого iNils. Подозреваю, что единственный способ разрешить его проблему - добавить ещё один параметр (индекс) и в теле метода завести счётчик. Что получается совсем уж некрасиво и тормозно. |
вот это реально дурдом )
тема вообще с другого начиналась, но раз уж понеслось, то, по-моему это немножко странный подход подбирать пример использования xml-данных под сами данные... обычно как-то наоборот бывает... (это я про пример, что взяли xml, раскидали его по клипам, там еще раз раскидали и еще:) ) ок, я никак не пойму чем не устраивает нормальная архитектура вида: object(корень): - name (имя) - attributes(массив аттрибутов) - cdata (текст) - nodes (массив аналогичных объектов) и пара вспомогательных методов для доступа к nodes. Реализация по своему вкусу, хоть бинарное дерево строй, если структура сложная и нужен быстрый поиск. оффтоп: может я чего не понимаю, но чего это за класс у которого все методы и свойства статические??? и как им потом пользоваться... или это такой извращенный вариант синглета???.. и зачем создавать класс с единственным методом, да еще и статическим? |
Цитата:
2. В некоторых случаях поиск будет осуществляться дольше: пробежались в цикле - взяли один нод, снова пробежались по тому же массиву - взяли второй и т.д. |
Цитата:
|
Цитата:
В последнее время я использую xml построенного на идеи древовидного id. То есть почти каждый потомок имеет id построенного из id предка + свой: /map/ > /map/city/ > /map/city/street/ и тд. Таким образом до нода я могу достучаться обычным способом и по абсолютному адресу. |
WindWalker, это уже каждый может реализовывать как хочет, балго проблема поиска уже имеет сотни решений (характерный пример БД), если ты считаешь, что поиск будет осуществляться медленно, то просто попробуй применить другой алгоритм сортировки и поиска. не вопрос... т.е. это как бы дело вкуса каждого. или вот пример iNils - тоже вариант. А если ноды называются одинаково, то сделать функцию аналог "SELECT smth WHERE smth=val".
__etc, нет, ну не стоит ведь доходить до абсурда. ООП - это метод решения задач, позволяющий не запутаться и избежать кучи ошибок, а не самоцель... я конечно понимаю, заставь дурака Богу молиться, но по-моему это очень некрасивый вариант, который точно никогда не стоит использовать. еще кстати тема классная, совсем про ее забыл. Если уж реально нужна высокая скорость (ни разу не видел таких приложений - все равно realtime не получится), то можно еще и кеширование результатов организовать с возможностью предугадывать следующие запросы. |
Цитата:
|
тогда вообще не понял - к чему здесь global??? и чем root не global (классно звучит :) )?
|
В AS2 классах не должно быть никаких _root и _global. Это не так уж и сложно соблюсти.
|
Цитата:
_root, в смысле _level0 есть когда идет запрос к flashvars... _global я часто использую, когда в FlashDevelop нужен setTimeout, иначе он ругается. А вобще, если _global используется в качестве get, а не set, то ничего страшного. |
ладно, если без них ну никак нельзя, то пусть будет так.. хотя я все равно не понял, зачем они нужны...
в других языках они используются в основном только для создания каких-нибудь можных callback'ов, функциональных указателей или синглтонов - в общем редко применяются, так что я наверное просто чего-то не знаю про них.. пойду почитаю ) |
Для flashvars у меня есть класс ExternalData, в него переменные кладутся кодом во fla-файле (там я допускаю использование _levelN и прочие _xxxx). В классах _root, _global и прочие вещи отсутствуют напрочь (кроме тех моментов, где их использование действительно жизненно необходимо).
А то, что ругается FD — это исключительно проблема программы. |
Самый простой пример класса, у которого только статические методы - Math.
|
всё, ушли в оффтоп... Math - это не столько класс в смысле ООП, сколько namespace.
|
Цитата:
|
да, конечно, это просто класс экземпляры которого нельзя создавать или по крайней мере не имеет смысла, т.к. они ничем не будут различаться; у которого все методы статические, т.е. он представляет из себя просто способ облегчения обращения к методам. Обычно это называется namespace.
Так, ладно, закрыли тему, если вы считаете, что класс, состоящий из 2-3 статических методов и пары статических свойств - это нормально и в стиле ООП... ну, ок... у вас свой стиль ООП ;) |
Вообще говоря, в том же нативном наборе классов плеера полно классов, которым просто не нужен экземпляр. Тот же Mouse, Stage и иже с ними.
И ситуаций, когда не нужен экземпляр — полно. Поясняй тогда, чем это не ООП. И объясни, что ты будешь делать, когда тебе потребуются некоторые сервисные функции вроде проверки E-mail на валидность (в случае с AS3 можно создать сразу функцию в пакете, это же не зря придумано?). Просто мне интересен твой подход к таким вещам, если у тебя действительно вариант будет лучше, я подумаю, как писать в следующий раз свои проекты. |
это не совсем класс - то, о чем ты говоришь называется синглет - класс, имеющий по определению только один экземпляр. и конструктор такого класса возвращает указатель на самого себя, не создавая при этом очередной экземпляр класса. Так это выглядит во всех языках программирования (на счет AS я точно не уверен, возможно выш выход - это единственно возможный). В случае, если не нужен класс и экземпляры создаваться не будут, то проще сделать clip с функциями (конечно это в принципе тот же класс, но все же) или просто набор функций. С точки зрения ООП это логичнее.
Класс сам по себе должен описывать некоторую абстракцию (как в школе учили, например, стол), а экземпляр детализирует эту абстракцию. |
Я не получил ответ на свой вопрос.
Синглтон тут вообще не при делах. |
Вот так:
Код:
isEmailValid = new EmailValidator(tfEmail.text).isValid()ООП - оно такое... |
| Часовой пояс GMT +4, время: 22:52. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.