PDA

Просмотр полной версии : Кто-нибудь с setInterval разбирался


RDA
11.03.2002, 17:42
пример:

game = function() {};

game.prototype.func1 = function()
{
trace(this);
};

game.prototype.func2 = function()
{
this.interval = setInterval(func1,1000);
};

Как не странно покажет: undefined

?????? Что за глюк

Nox Noctis
11.03.2002, 19:00
а как насчет setInterval(this.func1,1000); ?
:D :p :D

RDA
11.03.2002, 19:50
Согласен! (забыл)
Все равно тоже самое

Пашет если так: setInterval(this,"func1",1000);

john
11.03.2002, 20:07
setInterval(this.func1,1000);

не правильно, причем очень... :D

либо setInterval(объект, имя метода,время);

setInterval(this,"func1",1000);

либо

setInterval(ссылка на функцию,1000);

setInterval(this.func1,1000);

во втором случае функция будет выполнена не как метод а как функция, поэтому this внутри фунции будет относится не к объекту ...

Nox Noctis
11.03.2002, 20:16
Оригинал написал(а) john
setInterval(this.func1,1000);

не правильно, причем очень... :D
"не правильно" относится не ко мне, да ? ;)
насчет this'а в trace'е я проглядел, сознаюсь...

а вот setInterval(this.func1,1000); - это "очень правильно" :)

john
11.03.2002, 20:24
а вот setInterval(this.func1,1000); - это "очень правильно"

ДА? :D

function Foo()
{
this._name = "Foo";
this.method = function()
{
trace(this._name)
};
this.interval = setInterval(this.method,1000);
}

obj = new Foo();

Nox Noctis
11.03.2002, 20:35
ДА! :D а знаешь почему ?
потому что я говорю о том, что в виде
setInterval(func1,1000); (как было написано изначально)
это работать не будет.
а в виде
setInterval(this.func1,1000);
это работает (срабатывает функция)
- другое дело, что выводится и правда не то, что нужно. :p

кстати, любопытно:

test = function () {
this.member = function() {
trace(this);
};
this.test = setInterval(this.member, 200);
};
b = new test();
b.member();

в первом трейсе получаем [Object object] а во всех остальных - undefined

john
11.03.2002, 20:50
Да не "любопытно" а совершенно понятно :)
я к чему и веду, весь разговор... :)

что мы записываем фунцию как метод объекта
мы не можем вызвать метод через прямую ссылку на метод,

функция находится не "внутри" объкта, и при вызове прямой ссылки на функцию функци "не знает что она метод"

например есть объект

OBJ и у него есть метод "method"

obj = {}

obj.method = function(){}

теперь нам нужно вызвать метод но не напрямую (obj.method()) а сохранив его ссылку,

если сделать так

link = obj.method

и потом вызвать

link()

то мы вызываем функцию а не метод (смотри мой пред код с интервалом)

если мы сохнаним ссылку на объект

ob = OBJ
method_name = "method"

то в дальнейшем мы можем вызвать метод (именно метод а не функцию)

ob[method_name]()

Сейчас еще появилась одна возможность

через .set

ob = OBJ
func_link = OBJ.method

func_link.call(ob)

короче есть большая разница между
setInterval(this.func1,1000)
и
setInterval(this , "func1",1000)

:)

RDA
11.03.2002, 20:54
to John: Спасибо

Nox Noctis
11.03.2002, 21:07
Оригинал написал(а) john
Да не "любопытно" а совершенно понятно :)
нет мне именно любопытно ! :) (и как это мешает тому, что "совершенно понятно" ?)
все любопытственнее и любопытственнее ;)

спасибо за разъяснения. и не надо так нервничать.

john
11.03.2002, 21:10
Эх... если бы я по таким пустякам нервничал, просто времени мало (работаю я) поэтому пишу кратко и урывками, :)

Nox Noctis
11.03.2002, 21:34
function ball() {
this.onLoad = function() {
this._x = 0;
this._y = Stage.height/2;
this.onEnterFrame = function() {
this._x += 2;
if (_root.test.hitTest(this)) {
trace("HITTEST !!!");
this.onEnterFrame = null;
} else {
test._x--;
}
};
};
}

- вот так все работает

function ball() {
this.onLoad = function() {
this._x = 0;
this._y = Stage.height/2;
this.onEnterFrame = function() {
this._x += 2;
if (this.hitTest(_root.test)) {
trace("HITTEST !!!");
this.onEnterFrame = null;
} else {
test._x--;
}
};
};
}

- а так нет...
...как это объяснить используя вышеизложенное ? :rolleyes:

john
11.03.2002, 22:18
все просто, ты не определил конструктору (вернее прототипу) наследование от мувиклипа,


function ball()
{
this.onLoad = function()
{
this._x = 0;
this._y = Stage.height/2;
this.onEnterFrame = function()
{
this._x += 2;

if (this.hitTest(_root.test)) {
trace("HITTEST !!!");
this.onEnterFrame = null;
} else {
test._x--;
}
};
};
}

ball.prototype = new MovieClip()



Object.registerClass("ball",_root.ball)
_root.attachMovie("ball","bbbb",123);


Вот и все проблемы, нету у твоего мувика метода hitTest :)

Nox Noctis
12.03.2002, 01:52
спасибо, я уже и сам доехал, по пути домой с работы :)

насчет наследования и (в частности насчет обращения к суперклассу):
theSphere = function () {
};
theSphere.prototype = new MovieClip();
theSphere.prototype.method = function() {
trace("parent");
};
//
theBall = function () {
this.method = function() {
trace("child");
super.method();
};
};
theBall.prototype = new theSphere();
//
x = new theBall();
x.method();
- точно так же как и в примере хелпа.

а теперь почему у меня не срабатывало аследование хиттеста от МувиКлипа:
theSphere = function () {
this.method = function() {
trace("parent");
};
};
theSphere.prototype = new MovieClip();
то есть по сути та же самая ошибка с не туда указывающим 'this'

то есть чтобы все заработало нужно писать обязательно в следующем порядке:
1. 'родитель' = пустая функция
2. все что нужно присваивается через 'родитель'.prototype
3. 'потомок' = пустая функция
4. 'потомок'.prototype = new родитель()
5. все что нужно присваивается через 'потомок'.prototype
странновато это, разве нет ?
при попытке задания конструктора целиком, а не через свойство prototype, разваливается иерархия... :rolleyes:

john
12.03.2002, 02:25
Ну не знаю... все работает,
Не понимаю проблемы,

то есть по сути та же самая ошибка с не туда указывающим 'this'

все туда, туда вписывается :)
Это не ошибка, это система.....
Напряги свое "любопытство" и все станет на свои места.

john
12.03.2002, 02:48
может мне показалось,
но может быть ты думаешь что при

Object.registerClass("id",Constructor) (мы же по ООП мувиклипов всетаки говорим)

создается экземляр Constructor и присваивается свойству __proto__ ?

тогда как получается доплнительный этап иерархии, и действительно кострукция new MoviewClip() получается излишняя,

и достаточно было просто передать
ссылку на прототип мувиклипа, без создания экземпляра

...........................prototype = MovieClip.prototype;

на самом деле, когда мы делаем регистр класс, протопом нового мувиклипа будет прототип функции, и "ненужного" шага в наследовании нет,

function foo()
{
this._x = 100;
this._y = 100;
this.a = "a";
}
foo.prototype = new MovieClip();
Object.registerClass("test", foo);
_root.attachMovie("test", "mc", 123);

trace(mc.a);// трейсится а
trace(mc.__proto__.a); // трейсится undefined

Я прав? Или нет,

Вообще разговор затянулся, может даже и не стоит продолжать.....

Nox Noctis
12.03.2002, 03:49
любопытство не дремлет :)

всегда приятно услышать фразу - "это не ошибка, это система" : это успокаивает :D