Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Общие вопросы о Flash (не затрагивающие ActionScript) (http://www.flasher.ru/forum/forumdisplay.php?f=60)
-   -   Когда нужно использовать .apply? (http://www.flasher.ru/forum/showthread.php?t=72920)

profi80 07.12.2005 00:07

Когда нужно использовать .apply?
 
Смысл использования .apply: в Help'e сказано указывает значение this, которое будет использовано внутри какой-либо функции, вызываемой в ActionScript.
Если мне например нужно чтобы в функции this указывал на тот объект из которого функция вызывалась (а у меня это либо _root либо мувиклип), мне нужно вызывать функцию так:

Код:

Function.apply(this, [param1, param2, param3]);
А так я могу из своей функции менять свойства "родителя" функции (например, мувиклипа):

Код:

this._x --;
Всё правильно?

И только для этого используется .apply?

Извиняюсь, если задал немного ламерский вопрос, но для меня он очень важен (думаю, что для всех начинающих также).

Смольный (Smolniy) 07.12.2005 01:32

Скорее оно используется для вызова из класса (object в документации, т.е. любого класса, в т.ч. и МС).
Или вариант, когда функция прописана в одном месте, и оперирует this-ом, а при вызове хотелось бы чтобы она отработала "в другом scope".
Мне несколько раз доводилось использовать, но уже не вспомню контекста. Так или иначе, можно в конструктор класса вставить хэндлер функции - а то и прямо в экземпляр, даже не затрагивая конструктор - и вызывать ее как метод. Получится то же самое, только дополнительные хэндлеры, да они каши не просят...

Nirth 07.12.2005 01:56

Код:

//создаем функцию которая будет рисовать шарик
function drawBall(x:Number,y:Number):MovieClip {
        var depth:Number = _root.getNextHighestDepth();
        var result:MovieClip =  _root.createEmptyMovieClip("ball"+depth+"_mc",depth);
        result.lineStyle(35,0xFF6600);
        result.moveTo(x,y);
        result.lineTo(x+.5,y+.5);
        return result;
}
//рисуем два шарика
var mc1:MovieClip = drawBall(50,50);
var mc2:MovieClip = drawBall(50,100);
//создаем метод animate который будет двигать шарик
function animate(s:Number,e:Number):Void {
        new mx.transitions.Tween(this,"_x",mx.transitions.easing.Elastic.easeOut,s,e,30);
}
//теперь присобачиваем его к двум мувикам
mc1.onPress = function () {
        _root.animate.apply(this,[100,200])
}
mc2.onPress = function () {
        _root.animate.apply(this,[50,300])
}

Так же есть более продвинутый вариант - mx.utils.Delegate
в случае с делегатом будет выглядеть так
Код:

//создаем функцию которая будет рисовать шарик
function drawBall(x:Number,y:Number):MovieClip {
        var depth:Number = _root.getNextHighestDepth();
        var result:MovieClip =  _root.createEmptyMovieClip("ball"+depth+"_mc",depth);
        result.lineStyle(35,0xFF6600);
        result.moveTo(x,y);
        result.lineTo(x+.5,y+.5);
        return result;
}
//рисуем два шарика
var mc1:MovieClip = drawBall(50,50);
var mc2:MovieClip = drawBall(50,100);
//создаем метод animate который будет двигать шарик
function animate():Void {
        new mx.transitions.Tween(this,"_x",mx.transitions.easing.Elastic.easeOut,50,100,30);
}
//теперь присобачиваем его к двум мувикам
mc1.onPress = mx.utils.Delegate.create(mc1,animate);
mc2.onPress = mx.utils.Delegate.create(mc2,animate);

Прочитать про Tween можно тут
про Delegate тут

profi80 07.12.2005 02:41

Цитата:

Сообщение от Nirth
Код:

//создаем функцию которая будет рисовать шарик
function drawBall(x:Number,y:Number):MovieClip {
        var depth:Number = _root.getNextHighestDepth();
        var result:MovieClip =  _root.createEmptyMovieClip("ball"+depth+"_mc",depth);
        result.lineStyle(35,0xFF6600);
        result.moveTo(x,y);
        result.lineTo(x+.5,y+.5);
        return result;
}
//рисуем два шарика
var mc1:MovieClip = drawBall(50,50);
var mc2:MovieClip = drawBall(50,100);
//создаем метод animate который будет двигать шарик
function animate(s:Number,e:Number):Void {
        new mx.transitions.Tween(this,"_x",mx.transitions.easing.Elastic.easeOut,s,e,30);
}
//теперь присобачиваем его к двум мувикам
mc1.onPress = function () {
        _root.animate.apply(this,[100,200])
}
mc2.onPress = function () {
        _root.animate.apply(this,[50,300])
}


Так значит я был прав на счёт применения .apply? Мне пример один срочно надо разобрать, так в нём чувак почти повсеместно использует этот .apply - это плохо? (влияет на расход памяти/быстродействие)?

Кстати, область видимости между .as файлами не изменяется?

To Смольный: классы я пока не использую, и в том примере их тоже нет. Но, повторяюсь, там этот .apply очень часто используется.

Nirth 07.12.2005 02:46

Код:

Так значит я был прав на счёт применения .apply? Мне пример один срочно надо разобрать, так в нём чувак почти повсеместно использует этот .apply - это плохо? (влияет на расход памяти/быстродействие)?
я не знаю точно, но теоритически это метод класса Function, так что должен жрать больше, нежели просто вызов функции.

Код:

Кстати, область видимости между .as файлами не изменяется?
вот этого я не понял, что ты имел ввиду под as файлами? классы, если да то получаеться что меняеться(ибо у каждого класса будут свои экземпляры - следовательно разные области видимости)


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

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