Просмотр полной версии : Кто-нибудь с setInterval разбирался
пример:
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
Согласен! (забыл)
Все равно тоже самое
Пашет если так: setInterval(this,"func1",1000);
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); - это "очень правильно" :)
а вот 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
Да не "любопытно" а совершенно понятно :)
я к чему и веду, весь разговор... :)
что мы записываем фунцию как метод объекта
мы не можем вызвать метод через прямую ссылку на метод,
функция находится не "внутри" объкта, и при вызове прямой ссылки на функцию функци "не знает что она метод"
например есть объект
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)
:)
Nox Noctis
11.03.2002, 21:07
Оригинал написал(а) john
Да не "любопытно" а совершенно понятно :)
нет мне именно любопытно ! :) (и как это мешает тому, что "совершенно понятно" ?)
все любопытственнее и любопытственнее ;)
спасибо за разъяснения. и не надо так нервничать.
Эх... если бы я по таким пустякам нервничал, просто времени мало (работаю я) поэтому пишу кратко и урывками, :)
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:
все просто, ты не определил конструктору (вернее прототипу) наследование от мувиклипа,
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:
Ну не знаю... все работает,
Не понимаю проблемы,
то есть по сути та же самая ошибка с не туда указывающим 'this'
все туда, туда вписывается :)
Это не ошибка, это система.....
Напряги свое "любопытство" и все станет на свои места.
может мне показалось,
но может быть ты думаешь что при
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
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.