Форум Александра Михалицына

 
 Подписанные темыПодписанные темы   FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   ИзбранноеИзбранное    РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
Начать снегопад
RSS


Проблема с наследованием

 
Список форумов Форум Александра Михалицына -> JavaScript
 новая тема   ответить   версия для печати   скачать тему 
Предыдущая тема :: Следующая тема  
Автор Сообщение
Cr@ZyBoY
Starting Member
Starting Member


Возраст: 17
Пол: мужской
Зарегистрирован: 29.08.2008
Сообщения: 46

Откуда: Мытищи
Монет: 648

СообщениеДобавлено: Tue Nov 04, 2008 4:33 pm    Заголовок сообщения: Проблема с наследованием Скачать пост  цитировать 

В общем тема такая: пишу библиотеку анимации с поддержкой изменения скорости по тригонометрическим функциям. Для этого создал класс Transitions:
Код:
var Transitions = window.Transitions = {};
Transitions.types = {
   Line: function(p) {
      return p;
   },
   Bounce: function(p) {
      var value;
      for (var a = 0, b = 1; 1; a += b, b /= 2) {
         if (p >= (7 - 4 * a) / 11) {
            value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
            break;
         }
      }
      return value;
   },
   Sine: function(p) {
      return (1 - Math.cos(p * Math.PI)) / 2;
   }
};
for (var t in Transitions.types) {
   Transitions[t] = {
      me: t,
      easeIn: function(p) {
         return Transitions.types[this.me](p);
      },
      easeOut: function(p) {
         return 1 - Transitions.types[this.me](1 - p);
      },
      easeInOut: function(p) {
         return (p <= 0.5) ? Transitions.types[this.me](2 * p) / 2 : (2 - Transitions.types[this.me](2 * (1 - p))) / 2;
      }
   }
}

В объекте Transitions.types находятся функции по умолчанию - линейное изменение, синусоида и колебания. Далее идёт цикл, который создаёт в классе Transitions соответствующее свойство из types с тремя свойствами: easeIn, easeOut и easeInOut (прямая функция, перевёрнутая и прямая/перевёрнутая).

Функции вызываются примерно следующим образом: Transitions.Bounce.easeIn(число), Transitions.Sine.easeInOut(число). В ответ на это данные функции возвращают изменённые значения, в соответствии с указанной в них формулой.
Если просто вызвать такую функцию, например, вот так:
Код:
alert(Transitions.Sine.easeIn(0.6));
, то всё замечательно работает.
Проблема в том, что эти функции используются в другом классе - в классе самой анимации:
Код:
function Transition(curve, milliseconds, callback) {
    var start = new Date().getTime();
    var that = this;
   var done, oneLeft;
    this.runCallback = function() {
        that.run();
    };
   this.run = function() {
      if (!that.hasNext()) return;
      callback(that.next());
      setTimeout(that.runCallback, 10);
   }
   this.hasNext = function() {
      if (done) return oneLeft;
      var now = new Date().getTime();
      if ((now - start) > milliseconds) {
         done = true;
         oneLeft = true;
      }
      return true;
   }
   this.next = function() {
      oneLeft = false;
      var now = new Date().getTime();
      var percentage = Math.min(1, (now - start) / milliseconds);
      return curve(percentage);
   }
}

И если я напишу вот так:
Код:
var transition = new Transition(Transitions.Sine.easeIn, 1000, function(percentage) {
    element.style.top = (to - from) * percentage + from + "px";
});
transition.run();

З.Ы: element, to и from определены, дело не в них. Дело в том, что постоянно выводится ошибка
Цитата:
Ошибка: Transitions.types[this.me] is not a function

Почему выходит ошибка, если при простом вызове Transitions.Sine.easeIn() всё нормально работает?


Группы: [Разработчики]
Вернуться к началу
 профиль   л.с.   www   icq 
Александр Михалицын
Администратор
Администратор


Возраст: 14
Пол: мужской
Зарегистрирован: 13.06.2008
Сообщения: 541
Благодарности: 2/3
Откуда: Свердловская область, Краснотурьинск
Монет: 9276

СообщениеДобавлено: Tue Nov 04, 2008 7:12 pm    Заголовок сообщения:  Скачать пост  цитировать 

Так,
ну это особенность JavaScript'a,
ты не можешь присвоить метод другой переменной
и использовать - например, вот так, работать не будет:
Код:
function myClass()
{
   this.text = 'Hello, World!';
   this.method = function()
   {
      alert(this.text);
   }
}
var ex_myClass = new myClass();
var some_var = ex_myClass.method;
setTimeout(some_var, 1000);

Дело в том, что после присвоения ссылке метода,
метод оказывается в глобальном или инном контексте,
смотря в каком контексте была определенна переменная (ссылка).

Тоесть если ты вызываешь свой метод
по ссылке из другой функции, то в её контексте будет
искаться переменная me!


//Внимание!!!
Запуск вследующего примера опасен для жизни. Smile
Перед тем, как его запустить, запустите предыдуший.
Например:
Код:
function myClass()
{
   this.text = 'Hello, World!';
   this.method = function()
   {
      alert(this.text);
   }
}
var ex_myClass = new myClass();
function neVazjno()
{
   this.text = 1;
   var some_var = ex_myClass.method;
   setTimeout(some_var, 1000);
}
neVazjno();


Вот такие вот дела...
ООП.... Smile

Все что тут написано, я знаю благодаря терпиливым людям:
Furax, WingedFox. Smile
(Это отнюдь не значит, что они писали за меня этот текст,
они просто объяснили некоторые принципы, а до этих
вещей я уже сам допер. Обращайтесь - попробую помочь.)

А Furax, WingedFox,
вам огромное человеческое и дружеское спасибо! Спасибо друг

Дим, у меня у самого мозги набекрень от этого ООП были,
поверь. Но я пару десятков часов, поэксперемментировал
и все встало на свои места. Very Happy

_________________
Мои файлы
Мой локальный сервер
Мой аккаунт на forum.dklab.ru


Группы: [Sunset-cms team] [Авторы модификаций] [Модераторы] [Разработчики]
Вернуться к началу
 профиль   л.с.   e-mail   www   icq 
Cr@ZyBoY
Starting Member
Starting Member


Возраст: 17
Пол: мужской
Зарегистрирован: 29.08.2008
Сообщения: 46

Откуда: Мытищи
Монет: 648

СообщениеДобавлено: Tue Nov 04, 2008 9:20 pm    Заголовок сообщения:  Скачать пост  цитировать 

Так всё таки, что нужно сделать, чтобы Transitions.Sine.easeIn и остальное нормально вызывалось из класса Transition? Просто я уже перепробовал всё, что только можно Sad

Группы: [Разработчики]
Вернуться к началу
 профиль   л.с.   www   icq 
Александр Михалицын
Администратор
Администратор


Возраст: 14
Пол: мужской
Зарегистрирован: 13.06.2008
Сообщения: 541
Благодарности: 2/3
Откуда: Свердловская область, Краснотурьинск
Монет: 9276

СообщениеДобавлено: Wed Nov 05, 2008 7:00 am    Заголовок сообщения:  Скачать пост  цитировать 

Cr@ZyBoY,
вызывай ка глобал вару.
Тоесть так:
Код:
this.next = function() {
      oneLeft = false;
      var now = new Date().getTime();
      var percentage = Math.min(1, (now - start) / milliseconds);
      return Transitions.Sine.easeIn(percentage);
   }
Wink
По другому, помоему никак.
Хотя... с извратами страшными, возможно что-то и можно изобрести,
еще есть вот такой способ:
Код:
function Transition(curve, milliseconds, callback) {
this.me = чему-то там... например через аргумент передай!
Тогда остальное можно оставить!

_________________
Мои файлы
Мой локальный сервер
Мой аккаунт на forum.dklab.ru


Группы: [Sunset-cms team] [Авторы модификаций] [Модераторы] [Разработчики]
Вернуться к началу
 профиль   л.с.   e-mail   www   icq 
Furax
Бледнотик
Бледнотик


Возраст: 22
Пол: Не указан
Зарегистрирован: 29.08.2008
Сообщения: 172
Благодарности: 3/0

Монет: 1272

СообщениеДобавлено: Wed Nov 05, 2008 10:48 am    Заголовок сообщения:  Скачать пост  цитировать 

А можно ещё через call или apply контекст передать...

Группы: [Разработчики]
Вернуться к началу
 профиль   л.с. 
Cr@ZyBoY
Starting Member
Starting Member


Возраст: 17
Пол: мужской
Зарегистрирован: 29.08.2008
Сообщения: 46

Откуда: Мытищи
Монет: 648

СообщениеДобавлено: Wed Nov 05, 2008 5:26 pm    Заголовок сообщения:  Скачать пост  цитировать 

Цитата:
вызывай ка глобал вару.

Мне же не только синусоиду вызывать нужно, но и остальные!

Furax
Уже пробовал, но что-то никак... Буду ещё экспериментировать...


Группы: [Разработчики]
Вернуться к началу
 профиль   л.с.   www   icq 
Cr@ZyBoY
Starting Member
Starting Member


Возраст: 17
Пол: мужской
Зарегистрирован: 29.08.2008
Сообщения: 46

Откуда: Мытищи
Монет: 648

СообщениеДобавлено: Wed Nov 05, 2008 6:30 pm    Заголовок сообщения:  Скачать пост  цитировать 

Всё, разобрался Smile
Код:
for (var t in Transitions.types) {
   Transitions[t] = {};
   Transitions[t].easeIn = function(p) {
      return Transitions.types[this](p);
   }.bind(t);
   Transitions[t].easeOut = function(p) {
      return 1 - Transitions.types[this](1 - p);
   }.bind(t);
   Transitions[t].easeInOut = function(p) {
      return (p <= 0.5) ? Transitions.types[this](2 * p) / 2 : (2 - Transitions.types[this](2 * (1 - p))) / 2;
   }.bind(t);
}

http://sjs-tech.ru/test/carbon_js_v0_2_0_animation.htm


Группы: [Разработчики]
Вернуться к началу
 профиль   л.с.   www   icq 
Furax
Бледнотик
Бледнотик


Возраст: 22
Пол: Не указан
Зарегистрирован: 29.08.2008
Сообщения: 172
Благодарности: 3/0

Монет: 1272

СообщениеДобавлено: Wed Nov 05, 2008 7:27 pm    Заголовок сообщения:  Скачать пост  цитировать 

Cr@ZyBoY
Странный закон... При такой анимаци синусоида вообще не в тему - речь идёт о свободном падении.


Группы: [Разработчики]
Вернуться к началу
 профиль   л.с. 
Cr@ZyBoY
Starting Member
Starting Member


Возраст: 17
Пол: мужской
Зарегистрирован: 29.08.2008
Сообщения: 46

Откуда: Мытищи
Монет: 648

СообщениеДобавлено: Wed Nov 05, 2008 8:12 pm    Заголовок сообщения:  Скачать пост  цитировать 

Furax
Синусоида - это синусоида, в данном случае она не используется Smile Это просто рабочий пример использования класса Transitions.Bounce.easeIn. С тем же успехом я мог бы написать Transparence.Sine.easeIn (Out, InOut), текстовые блоки двигались бы просто по другому закону Smile
Посмотри тот пример, я его немного переписал для обработки всех возможных на данный момент законов.


Группы: [Разработчики]
Вернуться к началу
 профиль   л.с.   www   icq 
Александр Михалицын
Администратор
Администратор


Возраст: 14
Пол: мужской
Зарегистрирован: 13.06.2008
Сообщения: 541
Благодарности: 2/3
Откуда: Свердловская область, Краснотурьинск
Монет: 9276

СообщениеДобавлено: Thu Nov 06, 2008 12:18 pm    Заголовок сообщения:  Скачать пост  цитировать 

Всем на будушее.

Только вот я бы нестал к this прикручивать t,
это ведь не контекст, работает, но идеалогически
не верно. Wink
Лучше так:
Код:
for (var t in Transitions.types) {
   Transitions[t] = {};
   Transitions[t].easeIn = function(p) {
      return this(p);
   }.bind(Transitions.types[t]);
   Transitions[t].easeOut = function(p) {
      return 1 - this(1 - p);
   }.bind(Transitions.types[t]);
   Transitions[t].easeInOut = function(p) {
      return (p <= 0.5) ? this(2 * p) / 2 : (2 - Transitions.types[this](2 * (1 - p))) / 2;
   }.bind(Transitions.types[t]);
}

_________________
Мои файлы
Мой локальный сервер
Мой аккаунт на forum.dklab.ru


Группы: [Sunset-cms team] [Авторы модификаций] [Модераторы] [Разработчики]
Вернуться к началу
 профиль   л.с.   e-mail   www   icq 
Cr@ZyBoY
Starting Member
Starting Member


Возраст: 17
Пол: мужской
Зарегистрирован: 29.08.2008
Сообщения: 46

Откуда: Мытищи
Монет: 648

СообщениеДобавлено: Fri Nov 07, 2008 4:39 pm    Заголовок сообщения:  Скачать пост  цитировать 

Как понять, идеалогически не верно? Какая разница, что передать в функцию - переменную или объект? Помойму всё равно.
p.s: спасибо за ссылку, теперь хоть разобрался, что там к чему было и почему не работало Wink


Группы: [Разработчики]
Вернуться к началу
 профиль   л.с.   www   icq 
Александр Михалицын
Администратор
Администратор


Возраст: 14
Пол: мужской
Зарегистрирован: 13.06.2008
Сообщения: 541
Благодарности: 2/3
Откуда: Свердловская область, Краснотурьинск
Монет: 9276

СообщениеДобавлено: Sat Nov 08, 2008 11:30 am    Заголовок сообщения:  Скачать пост  цитировать 

Цитата:
Какая разница, что передать в функцию

Действительно, если это воспринимать как аргумент - все нормально,
а если подумать что ты присваиваешь this, переменную, как оно?

_________________
Мои файлы
Мой локальный сервер
Мой аккаунт на forum.dklab.ru


Группы: [Sunset-cms team] [Авторы модификаций] [Модераторы] [Разработчики]
Вернуться к началу
 профиль   л.с.   e-mail   www   icq 
Cr@ZyBoY
Starting Member
Starting Member


Возраст: 17
Пол: мужской
Зарегистрирован: 29.08.2008
Сообщения: 46

Откуда: Мытищи
Монет: 648

СообщениеДобавлено: Sat Nov 08, 2008 5:21 pm    Заголовок сообщения:  Скачать пост  цитировать 

Хм, а кто сказал, что this обязательно должен указывать на текущий объект? Даже по той ссылке, что ты приводил, рассказывается о том, что this может указывать совсем на другое место.
Такой метод передачи в функцию через this чего угодно используется уже достаточно давно и широко, так что не вижу причин для паники Wink


Группы: [Разработчики]
Вернуться к началу
 профиль   л.с.   www   icq 
Александр Михалицын
Администратор
Администратор


Возраст: 14
Пол: мужской
Зарегистрирован: 13.06.2008
Сообщения: 541
Благодарности: 2/3
Откуда: Свердловская область, Краснотурьинск
Монет: 9276

СообщениеДобавлено: Sun Nov 09, 2008 10:11 am    Заголовок сообщения:  Скачать пост  цитировать 

Cr@ZyBoY,
через this передается требуемый контекст!
И ни в коем случае он не должен являться
строкой, числом, массивом.

Это должен быть Object.
Wink

Ты можешь меня не слушать, типа я тут для пантов что-то говорю,
дело в общем твоё. Wink

Цитата:
Такой метод передачи в функцию через this чего угодно

Через this ты можешь передать что угодно, но сам this должен обозначать контекст, уже после обращаться к необходимой информации, при помощи свойств, как это продемонстрировал я.

_________________
Мои файлы
Мой локальный сервер
Мой аккаунт на forum.dklab.ru


Группы: [Sunset-cms team] [Авторы модификаций] [Модераторы] [Разработчики]
Вернуться к началу
 профиль   л.с.   e-mail   www   icq 
Показать сообщения:   
 новая тема   ответить   версия для печати   скачать тему  Часовой пояс: GMT + 3
Список форумов Форум Александра Михалицына -> JavaScript
Страница 1 из 1

Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете вкладывать файлы
Вы можете скачивать файлы


Powered by phpBB © 2001, 2005 phpBB Group

File Attachment © by Meik Sievertsen
HD eXPerience: Программы и статьи для вашего компьютера
Не нажимать! Убъёт!

Система Orphus
[ Time: 0.5727s ][ Queries: 61 (0.4776s) ][ Gzip: off ][ Memory: 0mb ]


Рейтинг SIMPLETOP.NET
EOMY TOP 100
Free DNS hosting provided by EditDNS.net