Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript (http://www.flasher.ru/forum/forumdisplay.php?f=5)
-   -   Как изменить класс подгруженного мувика? (http://www.flasher.ru/forum/showthread.php?t=37705)

Entropy 26.09.2002 19:55

Как изменить класс подгруженного мувика?
 
Здравствуйте.
Я подгружаю в главный мувик другой мувик. В главном есть класс и я хочу, чтобы подгруженный мувик стал экземпляром этого класса. Если бы этот самый мувик находился в библиотеке в качестве символа, то можно было бы сделать просто Object.registerClass("MySymbolID", MyClass), но тут не получится, так как главный мувик не имеет достуа к библиотеке подгруженного мувика. В общем, я пробовал сделать через __proto__:

Код:

//Это мой класс
function MyClass() {
    ...
}

// Здесь мувик уже загружен, меняем ссылку на прототип.
myMovie.__proto__ = new MyClass;

Вроде работает, но, вообще говоря, мне это не нравится, а главное, непонятно: если объект - экземпляр MovieClip, то к чему приведет подмена его __proto__? К тому, что экземпляр перестанет быть MovieClip'ом? А чем же он тогда будет?!

Хотелось бы узнать что происходит при подмене __proto__ у экземпляра (по моим наблюдениям ничего страшного), и как сделать так, чтобы подгруженный мувик стал экземпляром нужного мне класса, при условии, что внутри загружаемого мувика не должно быть вообще никакого кода. Варианты типа
Код:

// Добавляем новый метод в экземпляр.
myMovieClip.myMethod = function () {
    ...
}

или

// Добавляем метод в класс.
MovieClip.prototype.myMethod = function() {
    ...
}

не предлагать, так как первый случай слишком очевиден, а во втором новый метод распространяется на все мувики, а нужно только на избранные (в целях безопасности). Еще я подумываю над тем, чтобы впихнуть-таки мой метод в MovieClip.prototype, а затем сделать его приватным с помощью ASSetPropFlags, с тем, чтобы после открыть в нужных мне экземплярах.

Кто может предложить что-то лучшее?

Спасибо.

Nox Noctis 26.09.2002 21:35

если сделать прототипом
твоего подгружаемого класса
объект МувиКлип -
то замена __прото__ у мувика не приведет
к потере родных мувиклиповых методов

Код:

cls = function (name) {
        this.prop = "!!!!!!!!"+name+"!!!!!!!!";
};
cls.prototype = new MovieClip();
cls.prototype.method = function() {
        trace("method of "+this.prop+" called !");
};
//
x = createEmptyMovieClip("$1", 666);
x.__proto__ = new cls();
//
ASSetPropFlags(x.__proto__, null, 8, true);
for (i in x.__proto__) {
        trace(i+" :: "+typeof (x.__proto__[i])+" :: "+x.__proto__[i]);
}


Entropy 26.09.2002 23:52

Спасибо, это я знал, но к сожалению не все так просто. Например, вот код.

Код:

// Создаем новый мувик.
_root.createEmptyMovieClip("square", 1);

// Рисуем красный прямоугольник.
with (_root.square) {
    beginFill(0xFF0000);
    moveTo(0, 0);
    lineTo(100, 0);
    lineTo(100, 100);
    lineTo(0, 100);
    lineTo(0, 0);
    endFill();
}

//Строка ниже закоментирована.
//_root.square.__proto__ = {};

// Очищаем мувик и рисуем зеленый квадрат левее.
with (_root.square) {
    //Строка ниже закоментирована.
    //clear();       
    beginFill(0x00FF00);
    moveTo(200, 0);
    lineTo(300, 0);
    lineTo(300, 100);
    lineTo(200, 100);
    lineTo(200, 0);
    endFill();
    // Поворачиваем весь мувик целиком на 45 градусов.
    _rotation = 45;
}

Если прогнать этот код, то в результате будут нарисованы два квадрата, повернутые вокруг начала координат, что и следовало ожидать. А вот теперь попробуйте угадать, что будет если раскомментировать строку "_root.square.__proto__ = {};". По логике вещей мувик перестает быть мувиком (я проверял дампы и, в общем, похоже, что так и есть), но тогда вопрос: а что же делает немувик на сцене? Абсурд. И наконец все его свойства и методы находящиеся в прототипе MovieClip будт недоступны, а значит, полученый мувик не сможет нарисовать зеленый квадрат и повернуть сам себя, но пути Макромедии неисповедимы: зеленый квадрат все-таки ресуется, но поворачивается... только красный. Кроме того, раскомментировав метод clear() можете убедиться, что он, как и положено не работает в данной ситуации. Такие дела.

То ли я чего-то не понимаю, то ли __proto__ экземпляра лучше не трогать, так как последствия непредсказуемы.

И все же как присвоить класс подгруженному мувику? Неужели перечисленные выше способы единственные?

Entropy 27.09.2002 00:20

Так, стоп, тормознул я чего-то. Вы правы, Nox Noctis, только добавлю, что строка

x.__proto__ = new cls();

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

y.__proto__ = x.__proto__;

Всем спасибо, как я сам не догадался? :(

Nox Noctis 27.09.2002 01:17

Цитата:

Оригинал написал(а) Entropy
будет каждый раз создавать новый обект-протоитп
ну да вобщем...
это я по инерции написал, аналогично cls.prototype = new MovieClip();

правильнее написать
x.__proto__ = cls.prototype

хотя результат тот же:
на самом деле
prototype и __proto__
- это разные названия одного и того же


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

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