Форум 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)
-   -   dynamic class create (http://www.flasher.ru/forum/showthread.php?t=65522)

AlDev 11.06.2005 20:29

dynamic class create
 
Вообщем наступил на грабли...
требуется создать класс через его имя, откопал интересную доку:
http://www.gskinner.com/blog/archive...locations.html

однако, пробую:
Код:

function getInstanceOf(p_fullName:String):Object
{
        var classPath:Array = p_fullName.split(".");
        var package:Object = _global;
        var l = classPath.length-1;
        for (var i:Number=0;i<l;i++)
        {
                  package = package[classPath[i]];
        }
        var c:Function = package[classPath[classPath.length-1]];
        var instance:Object = new c();
        return instance;
}
var a = getInstanceOf("classes.map.layers.landscape");
trace (a);
stop();

на выходе идёт undefined, хотя класс существует...
не могу понять, в чём проблема...
помогите, pls

Nirth 11.06.2005 20:40

В моем случае(перед вызовом функции, создал экземпляр, для того чтобы класс импортировался) возвращает object Object, правда я вопроса не понял.
Попробуй удостовериться, что класс существует...потому что если класс не используеться, то он и не импортируеться во флэшку.
Код:

function getInstanceOf(p_fullName:String):Object
{
        var classPath:Array = p_fullName.split(".");
        var package:Object = _global;
        var l = classPath.length-1;
        for (var i:Number=0;i<l;i++)
        {
                  package = package[classPath[i]];
                  trace(package)
        }
        var c:Function = package[classPath[classPath.length-1]];
        var instance:Object = new c();
        return instance;
}
var b:orange.utils.FPS = new orange.utils.FPS(20);
trace(getInstanceOf("orange.utils.FPS"));

import package.Class в данном случае не помогает.
если мы напишем
Код:

import mx.controls
и в test movie нажмем crtl+shift+v то получим
Цитата:

Level #0:
Variable _level0.$version = "WIN 7,0,19,0"
а если
Код:

import mx.controls.*
var a = new CheckBox();

то получаем
Цитата:

Global Variables:
Variable _global.mx = [object #1, class 'Object'] {
core:[object #2, class 'Object'] {
UIObject:[function 'symbolOwner'],
UIComponent:[function 'symbolOwner']
},
skins:[object #5, class 'Object'] {
SkinElement:[function 'SkinElement']
},
styles:[object #7, class 'Object'] {
CSSTextStyles:[function 'CSSTextStylesDependency'],
CSSStyleDeclaration:[function 'CSSStyleDeclaration'],
StyleManager:[function 'StyleManager']
},
controls:[object #11, class 'Object'] {
SimpleButton:[function 'symbolOwner'],
Button:[function 'symbolOwner'],
CheckBox:[function 'symbolOwner']
}
}
Level #0:
Variable _level0.$version = "WIN 7,0,19,0"
Variable _level0.a = [object #15] {}

AlDev 11.06.2005 20:43

хмм... а если нет возможности создать по экземпляру класса?
каким образом тогда можно это обойти?

Nirth 11.06.2005 20:47

как я уже сказал я не понял сути вопроса, тебе нужно создать в условиях AS1 класс написанный на AS2 ? если так то возможнсть уже присутствует(ибо тебе придеться выбрать в настройках AS2 для Flash 6 или 7) ...или я не догоняю?

s_u_m_p 11.06.2005 20:52

причем тут в условиях ас1 классы ас2??? человек хочет иметь возможность по названию класса создать объект! это как раз чистый ас2

ну проблемы ты правильно указал, если нету явного упоминания класса, его и не будет в результируещем свф, так что либо в библиотеки создать пустые мувы, которые будут связаны с теми классами которые нужны или запихнуть в свф все нужные классы через мтаск - мне так кажется :)

AlDev 11.06.2005 20:52

в условиях AS2 создать AS2 class. Это просто пример функции, на самом деле всё это по классам пораспихано и из классов вызывается

Цитата:

если так то возможнсть уже присутствует(ибо тебе придеться выбрать в настройках AS2 для Flash 6 или 7)
малость не понял, что ты хотел сказать этой фразой?

s_u_m_p 11.06.2005 20:54

потом импорт, это больше деректива к компилятору на сокращение пути к классу, тем более все это действует только в том кадре где импорт указан, естественно в данном случае не поможет....

AlDev 11.06.2005 20:57

так и думал, что придётся извращаться :(
спасибо за идею с mtasc

да и ещё один тупой вопрос из той-же серии....
как получить аргументы, передаваемые функции, достаточно просто и понятна (через arguments). А вот как эти аргументы потом передать конструктору класса в текущей функции?
то есть юзание
var a = getInstanceOf("classes.map.layers.landscape",val1,val2);
было-бы эквивалентно
var a = new classes.map.layers.landscape(val1,val2);

Nirth 11.06.2005 21:01

Цитата:

var a = getInstanceOf("classes.map.layers.landscape",val1,val2);
было-бы эквивалентно
var a = new classes.map.layers.landscape(val1,val2);
посмотри в хелпе Function.apply придеться чуть доработать, функцию getInstanceOf()
и всеже я до сих пор не врубаюсь, зачем все это, если можно написать new package.Class();

s_u_m_p 11.06.2005 21:04

:) Nirth представь момент что ты заранее не знаешь что это будеть new x.a.s.Class1 или new x.a.s.Class2

:) через функшн.апли тоже не пройдет, не тот случай, я думаю тебе просто надо будет написать эквивалент оператора new


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

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