PDA

Просмотр полной версии : Как изменить класс подгруженного мувика?


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__
- это разные названия одного и того же