Нарядная инициализация AS1 классов. AS2 классы привнесли новые понятия в программирование на ActionScript.
Приватные и публичные методы, статические члены класса и т.п.
Однако, тот факт, что AS2 класс может быть откомпилен в 6-ю версию плеера говорит от том,
что в самой сути кода ничего не изменилось, что всё это реализуемо в AS1. Как? #initclip
this.set$$$Class = function() {
delete this.set$$$Class;
var $$$Class = _global.$$$=function () {
this.init();
};
Object.registerClass('$$$_mc', $$$Class);
ASSetPropFlags(_global, "$$$", 7, 1);
var tmp = $$$Class.prototype=new MovieClip();
tmp.init = function() {
};
};
this.set$$$Class();
#endinitclip
- не правда ли, странный код? Как думаете, сколько времени у меня ушло на его написание?
Доли секунды. Во флэше, когда курсор на редакторе кода, я последовательно нажал три клавиши:
Esc+s+c и получил этот код. <folder name="Global Functions" id="Actions"........................втыкаем следующий XML узел: <folder name="Personal" id="Personal" tiptext="Presonal" helpid=""> Сохраняем XML, перезапускаем редактор Flash. Всё. Ескейп-последовательность добавлена.
Теперь, при последовательном наботе Esc+s+c в окне редактора вставится заготовка класса. #initclip
this.setBallClass = function() {
delete this.setBallClass;
var BallClass = _global.Ball = function () {
this.init();
};
Object.registerClass('Ball_mc', BallClass);
ASSetPropFlags(_global, 'Ball', 7, 1);
var tmp = BallClass.prototype=new MovieClip();
tmp.init = function() {
};
};
this.setBallClass();
#endinitclip
Теперь, собственно, можно приступить к изучению того, что мы натворили. this.setBallClass = function() {
delete this.setBallClass;
var BallClass = _global.Ball=function () {
this.init();
};
ASSetPropFlags(_global, 'Ball', 7, 1);
var tmp = BallClass.prototype={};
var my_array = ["Hello, ", "world!"];
tmp.init = function() {
trace(my_array[0]+my_array[1]);
};
};
this.setBallClass();
// TEST
foo = new Ball()// Hello, world!
Самое время заглянуть в листинг переменных. Ничего кроме созданного экземпляра класса мы не увидим.
_global.Ball закрыт с помощью ASSetPropFlags,
а массив my_array хоть и существует в памяти, но добраться до него невозможно,
иначе, как из методов класса Ball. #initclip
this.setBallClass = function() {
delete this.setBallClass;
var BallClass = _global.Ball=function () {
this.init();
};
Object.registerClass('ball_mc', BallClass);
ASSetPropFlags(_global, 'Ball', 7, 1);
var tmp = BallClass.prototype=new MovieClip();
tmp.max_width = 100;
tmp.max_height = 100;
var step = 2;
BallClass.create = function(thisObj, name, depth, initObj) {
var mc = thisObj.createEmptyMovieClip(name, depth);
mc.beginFill(0, 100),
mc.lineTo(10, 0), mc.lineTo(10, 10), mc.lineTo(0, 10),
mc.endFill();
for (var i in initObj) {
mc[i] = initObj[i];
}
mc.__proto__ = tmp;
BallClass.call(mc);
return mc;
};
var setDimentions = function () {
if ((this._width += step)>=this.max_width) {
this._width = this.max_width;
}
if ((this._height += step)>=this.max_height) {
this._height = this.max_height;
}
if (this._height == this.max_height && this._width == this.max_width) {
delete this.onEnterFrame;
}
};
tmp.init = function() {
this._width = this._height=1;
this.onEnterFrame = setDimentions;
};
};
this.setBallClass();
#endinitclip
Ок. бросаем на сцену мувик ball_mc и слоем выше втыкаем код: Ball.create(this, "ball1_mc", 1, {_x:30, _y:50})
Тестируем, не верим своим глазам, восхищаемся результатом. #initclip
this.setBallClass = function() {
delete this.setBallClass;
if (_global.Ball) {
return
}
// код дальше....
};
второй момент, на который бы мне хотелось указать, это то, что локальные переменные можно объявлять когда угодно,
т.е. использовать до того, как они объявлены. В связи с этим не рекомендуется (особенно в отношении конструктора класса)
практика задания функций таким способом:
function myPrivateFunction (){
// code here
}
и настоятельно рекомендуется использование такого синтаксиса:
var myPrivateFunction = function (){
// code here
}
Хотя эффект практически тот же, однако, в первом случае,
компилятор во время компиляции перемещает функцию со своего места на самый верх.
В итоге функция будет объявлена до кода:
if (_global.Ball) {
return
}
что в некоторых случаях может повлечь за собой неожиданные последствия. обсуждаем статью здесь читаем подальше>> |
|