Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Взятие свойства и сабсвойства у обьекта (http://www.flasher.ru/forum/showthread.php?t=156365)

JekaB 20.05.2011 12:29

Взятие свойства и сабсвойства у обьекта
 
Доброго времени суток!

Значит у меня есть класс:

Код AS3:

public class Child extends Object
        {
                private var _age:uint;
 
                public function Child()
                {
                        _age = 5;
                }
 
                public function get age():uint
                {
                        return _age;
                }
        }

и потом еще один класс:

Код AS3:

public class Parent extends Object
        {
                private var _child:CHILD = null;
 
                public function Parent()
                {
                        _child = new Child();
                }
                public function get Child():Child
                {
                        return _child;
                }
        }

Потом если я делаю вот так тогда все работает:

Код AS3:

var obj:Parent = new Parent;
var objChild:Child = obj["Child"];
var years:uint = objChild["Age"]; //все работает

или вот так:

Код AS3:

var obj:Parent = new Parent;
var years:uint = obj.Child.Age; //так тоже все работает

А если делаю вот так:

Код AS1/AS2:

var obj:Parent = new Parent;
var years:uint = obj["Child.Age"]; // Основной поток (Приостановлено: ReferenceError: Error #1069: Property Child.Age not found on myHost and there is no default value.)


Как мне сделать, чтобы работал самый последный вариант. Другие варианты не подходят, так как так вызывает свойство ["Child.Age"] внешнее окружение, и я его изменить никак немогу. Как такое обработать? Посоветуйте варианты

etc 20.05.2011 12:51

Потому что свойство «Child.Age» отсутствует у obj. Чтобы добраться до свойств, нужен метод типа такого:

Код AS3:

function getProperty(obj:Object, property:String):* {
    if (property in obj) return obj[property];
    if (property.indexOf('.') < 0) return undefined;
 
    var path:Array = property.split('.');
 
    while (path.length) {
        var name:String = path.shift() as String;
        if (!(name in obj)) return undefined;
        obj = obj[name];
    }
 
    return obj;
}
 
var obj:Parent = new Parent();
trace(getProperty(obj, 'child.age'));

з. Ы. Писал на коленке прямо тут, не проверял.

JekaB 20.05.2011 13:37

Спасибо, но у меня есть проблемка... А что если мой обект Parent обьявлен как:

Код AS3:

public class Parent extends EventDispatcher
{
....

А я как понимаю, эта функция класа Proxy

etc 20.05.2011 13:39

Нет, это просто функция.

JekaB 20.05.2011 13:55

Вписал я функцию так:

Код AS3:

public function getProperty(obj:Object, property:String):*
                {
                        trace("ON getProperty");
                        return null;
                }

Она не вызываеться (по брекпоинту нету остановки, трейс не выводится)
Может вы меня не так поняли, я могу только изменить класс Parent.
А вызов

Код AS3:

var obj:Parent = new Parent;
var years:uint = obj["Child.Age"];

осуществляеться извне, я его никак не могу изменить

etc 20.05.2011 13:59

Вот полностью рабочий тест:

Код AS3:

var obj:Object = {child: {age: 10}};
trace(getProperty(obj, 'child.age')); // 10

Чего и как там у вас не вызывается, что вы можете изменить или нет, я не знаю.

JekaB 20.05.2011 14:09

У меня есть черный ящик, которому я отдаю обьект Parent
В середине етого черного ящика идет вызов (после декомпиляции SWF файла я его могу видеть)

Код AS3:

...
objParent["Child.Age"];
...

этот вызов именно такой и никакой иначе !!! Класс Parent ето как хост, который я отдаю черному ящику. Хост имеет заранее определенные функции, я их должен определить так, чтоб не было никакой ошибки.
Черный ящик на перед знает эти функции и вызывает их по своему усмотрению. Вопрос в том, как опердилить свой клас, чтоб все запросы с черного ящика не обламывались.

-De- 20.05.2011 14:13

Может, вам больше подойдёт вариант типа:
Код AS3:

public dynamic class Parent// extends Object// - бесполезно, всё и так его расширяет)
        {
                public function Parent()
                {
                        this["Child.Age"] = 13;
 
                }
        }

PS: Пахнет ужосом, за вызовы типа obj["Child.Age"] надо бы чото отрезать.

etc 20.05.2011 14:14

JekaB, вас непонятно и в чём вы там ковыряетесь тоже.

JekaB 20.05.2011 14:36

А что тут непонятного?
Есть навигатор, который рисует обьекты разные. Информацию про обьекты берет из обьекта хоста. Хост имеет заранее определенный интерфейс. Хост и имплементацию интерфейса программирую я. Вот где то в недрах навигатора идет вызов obj["Child.Age"], так как Child и Age функции должны уже быть.
Если быть точне, вызываеться так:

Код AS3:

 private var agePath:String = "Child.Age";
...
 private function getHostPropertyAge() : uint
        {
            return host == null ? (null) : (getter != null ? (getter(host)) : (host[agePath]));
        }// end function
...

где host не нулевой обьект Parent, getter равен нулю


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

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