Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Почему все свойства объекта получают тип "object" ? (http://www.flasher.ru/forum/showthread.php?t=90328)

Annihilator 08.01.2007 21:09

Почему все свойства объекта получают тип "object" ?
 
Есть очень полезный и удобный метод, который на основании XML-а делает объект со свойствами
Код:

XML.prototype.toObject = function () {
var xparse = function (n) {
        var o = new String (n.firstChild.nodeValue), s, i, t;
        for (s = (o == "null") ? n.firstChild : n.childNodes[1]; s != null; s = s.nextSibling) {
                if(s.childNodes.length > 0){
                        t = arguments.callee(s);
                } else {
                        t = new String (s.nodeValue);  //явно задан тип String
                }
                for (i in s.attributes) t[i] = s.attributes[i];
                if (o[s.nodeName] != undefined) {
                        if (!(o[s.nodeName] instanceof Array)) o[s.nodeName] = [o[s.nodeName]];
                        o[s.nodeName].push(t);
                        t.xmlCount = s.childNodes.length;
                } else {
                        o[s.nodeName] = t;
                }
                o[s.nodeName].xmlCount = s.childNodes.length;
        }
        return o;
}
return xparse (this);
}

Например, из такого XML:
Код:

<?xml version="1.0" ?>
<xmltest>
<num>500</num>
<txt attributeExample="Node 2 attribute">
        <some>777</some>
        <thing>qwerty</thing>
</txt>
</xmltest>

получается объект со свойствами:
Код:

xmltest.num; // = 500
xmltest.txt.attributeExample; // = Node 2 attribute
xmltest.txt.some; // = 777
xmltest.txt.thing; // = qwerty

Всё замечательно, пока дело не доходит до операций с этими свойствами - все они оказываются типа "object" выходит совсем не то, что должно:
Код:

var a = xmltest.num + xmltest.txt.some;
trace(a); // выводит 500777 вместо 1277
var b = "qwerty";
trace(typeof b) // - string
trace(b == xmltest.txt.thing); // выводит false вместо true
b = xmltest.txt.thing;
trace(typeof b) // - object
//... и прочие подобные неприятности, хотя функция быстрая и очень полезная для сокет-общения.

Почему так получается и как добиться, чтобы они получали правильный тип (для строк - string, для чисел - number, и т.п.) ?

iNils 08.01.2007 21:16

Код:

s = 5;
n1 = new String (s);
n2 = String (s);
trace (typeof n1);
trace (typeof n2);
/////
n = "5";
s1 = new Number (n);
s2 = Number (n);
trace (typeof s1);
trace (typeof s2);

Так понятно почему?

Annihilator 08.01.2007 21:29

непонятно почему из "n1 = new String (s)" получается тип object а не string ???

iNils 08.01.2007 21:41

Код:

s = 5;
n1 = new String (s);
n2 = String (s);
trace (n1.length);
trace (n2.length);

В первом случаи, это конструктор класса.
Во втором приведением типов.

Обычно, мы задаем строковой литерал, то есть
Код:

str = "234"
Но у литерала нет ни методов ни свойств. Поэтому когда мы делаем
Код:

trace (str.length)
интерпретатор автоматически преобразовывает литерал во временной объект String (то есть new String), выполняет метод, а потом удаляет временной объект.

PS. Поэтому все методы и свойства работают быстрее, если у нас объект String, а не литерал. Например length в 5 раз.

Annihilator 08.01.2007 22:07

Спасибо, это понял, но как это применить в моей функции не догоняю.
писал эту строку хоть так:
t = new String (s.nodeValue);
хоть так:
t = String (s.nodeValue);
хоть так:
t = s.nodeValue;

разницы никакой, все равно все свойства получают тип object.

iNils 08.01.2007 22:25

Я не понял как ваш метод применить.
Код:

XML.prototype.toObject = function () {
        var xparse = function (n) {
                var o = new String (n.firstChild.nodeValue), s, i, t;
                //trace (o)
                for (s = (o == "null") ? n.firstChild : n.childNodes[1]; s != null; s = s.nextSibling) {
                        if (s.childNodes.length > 0) {
                                t = arguments.callee (s);
                        } else {
                                t = new String (s.nodeValue);
                                //явно задан тип String
                        }
                        for (i in s.attributes) {
                                t[i] = s.attributes[i];
                        }
                        if (o[s.nodeName] != undefined) {
                                if (!(o[s.nodeName] instanceof Array)) {
                                        o[s.nodeName] = [o[s.nodeName]];
                                }
                                o[s.nodeName].push (t);
                                t.xmlCount = s.childNodes.length;
                        } else {
                                o[s.nodeName] = t;
                        }
                        o[s.nodeName].xmlCount = s.childNodes.length;
                }
                return o;
        };
        return xparse (this);
};
s = '<?xml version="1.0" ?><xmltest><num>500</num><txt attributeExample="Node 2 attribute"><some>777</some><thing>qwerty</thing></txt></xmltest>';
xml = new XML (s);
trace (xml.toObject ());

и простой вызов возращает null.

Annihilator 09.01.2007 14:14

Вот так:
Код:

s = '<?xml version="1.0" ?><xmltest><num>500</num><txt attributeExample="Node 2 attribute"><some>777</some><thing>qwerty</thing></txt></xmltest>';
var x:XML=new XML();
x.ignoreWhite=1; // это обязательно задавать
x.parseXML(s);
var xmlobj = x.toObject();
// дальше обращаться к свойствам созданого объекта xmlobj:
trace(xmlobj.xmltest.num); // 500
trace(typeof xmlobj.xmltest.num); // object    :(


etc 09.01.2007 14:28

А можно вопрос? Зачем объект преобразовывать в объект?

Annihilator 09.01.2007 15:03

где ты это видишь?
Я из XML-объекта делаю обычный объект со свойствами, чтобы не плутать по XML-ю через childNodes, nodeName, nodeValue и др., а обращаться к нормальным свойствам нормального объекта. Кроме того, таким способом можно сразу существующему объекту поменять свойства или добавить новые. У меня это отлично работает в связке с сокет-сервером.

etc 09.01.2007 15:18

Как это где вижу? XML — объект, им же и остался. А что будешь делать, когда у тебя будет два тега с одним именем?


Часовой пояс GMT +4, время: 23:57.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.