![]() |
Модераторы: Sardar, Aliance |
![]() ![]() ![]() |
|
drainme |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 21.4.2009 Репутация: нет Всего: нет |
Всем привет , столкнулся с проблемой ооп в js. Есть псевдо класс, описывающий подключение в фоновом режиме - ajax запрос проще говоря. Проблема судя по всему в прототипах, ибо без классов все работает, но мне хочется разобраться и собрать библиотеку для ajax. Проблема в функции handle_response (33-45), там не видно свойства request. Еще есть сомнение по поводу onreadystatechange(25) - возмонжно я неправильно задал callback.
![]()
Это сообщение отредактировал(а) drainme - 12.8.2010, 16:03 |
|||
|
||||
Amphiluke |
|
|||
![]() ☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 39 Всего: 112 |
Попробуйте вместо этого так:
Дело в том, что в обработчиках событий ключевое слово this указывает на объект, в котором происходит событие, в данном случае на объект XMLHttpRequest, а не на ваш собственный объект http_request. |
|||
|
||||
IDVsbruck |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 778 Регистрация: 12.11.2006 Репутация: 7 Всего: 22 |
Плохой пример. Переменная к моменту срабатывания события может быть недоступна. Надо использовать передачу параметров, а еще лучше замыкание.
|
|||
|
||||
Amphiluke |
|
|||
![]() ☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 39 Всего: 112 |
А чем это не замыкание? Цепочка областей видимости анонимной функции, назначаемой свойству onreadystatechange, включает объект вызова внешней функции. Сборщик мусора не удалит переменную thisAlias, пока вложенная функция будет ссылаться на объект вызова. Нет?
Это сообщение отредактировал(а) Amphiluke - 12.8.2010, 21:18 |
|||
|
||||
drainme |
|
|||
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 21.4.2009 Репутация: нет Всего: нет |
Большое спасибо за разъяснения, сам бы еще долго искал решение, но вот что интересно с моим прежним кодом" = this.handle_response", функция срабатывает(просто алерт вставил для теста), по поводу xmlhttpobject'a логично и тему можно закрывать, но почему this работает все-таки интересно
Это сообщение отредактировал(а) drainme - 13.8.2010, 10:17 |
|||
|
||||
IDVsbruck |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 778 Регистрация: 12.11.2006 Репутация: 7 Всего: 22 |
Извини, дорогой ... Для раздела "JavaScript для новичков" пример вполне дееспособный, но если мы говорим о более серьезном подходе, то вариант никудышний. Я молчу о том, что переменная thisAlias теоретически может быть переопределена на момент срабатывания хандлера - это, конечно же, маловероятно, но надежность кода страдает. А вот то, что анонимная функция, назначенная onreadystatechange, НИЧЕГО пока не знает о своей "начинке" - это факт достаточно известный ![]() Добавлено через 11 минут и 9 секунд Там где назначен this.handle_response, он существует, так как this в данном случае ссылается на объект типа http_request, то есть противоречий нет. А когда позже идет ссылка на this.request, то у handle_response такого свойства/функции нет. Можно получить через parent.request или обратиться просто через request - не стал пристально смотреть код и тестировать его, но думаю, это свойство (без this) будет доступно. |
|||
|
||||
Amphiluke |
|
||||
![]() ☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 39 Всего: 112 |
IDVsbruck, спасибо, а вы не могли бы набросать примерчик?
![]() Вот я начну потихоньку.
Можно сделать и так (типа еще «замыкание» ![]()
но это же опять неправильно, по-вашему? Напишите, please, как вам видится наиболее грамотное решение. Добавлено через 3 минуты и 11 секунд Именно для этой простой задачки. |
||||
|
|||||
ksnk |
|
||||
![]() прохожий ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 6855 Регистрация: 13.4.2007 Где: СПб Репутация: 48 Всего: 386 |
drainme,
там еще есть строка 29
оно работало когда-нибудь? Вот сюда тоже надо бы замыкание поставить.
проблема в том, что в этом случае при выполнении функции this будет указывать в объект window, а не в http_request -------------------- Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! ![]() |
||||
|
|||||
IDVsbruck |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 778 Регистрация: 12.11.2006 Репутация: 7 Всего: 22 |
Человек дурню написал, а мы с тобой должны на поводу вестись? Хотя бы: Не считаю, что я должен учавствовать в споре "а слабо?" с заведома абсурдными данными. В js (и фреймворках) мы же не переопределяем функции для обработчика, а создаем их и назначаем. Почему тут должно быть иначе? - Зачем делать обработчик в составе прототипа - дурня же! Если функция обработчика выполняет какие-то узкоспециализированные действия внутри класса, то делается переменная класса, указывающая на внутреннюю функцию, или еще лучше - грамотно написанная анонимная функция (действие-то внутреннее, можно постараться, чтобы казусов с загрязнение памяти не было). Поэтому я принципиально не хочу поддерживать данный спор (дабы не было мысли, что я не могу или не знаю как и что делать - слава аллаху, за несколько лет работы школу получил неплохую). |
|||
|
||||
Amphiluke |
|
|||
![]() ☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 39 Всего: 112 |
Ладно, ясно… что ничего не ясно
![]() ![]() Это сообщение отредактировал(а) Amphiluke - 13.8.2010, 22:11 |
|||
|
||||
IDVsbruck |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 778 Регистрация: 12.11.2006 Репутация: 7 Всего: 22 |
Ага, а ну-ка, для начала покажи мне пример создания в javascript'е псевдо-класса
![]() |
|||
|
||||
Amphiluke |
|
|||
![]() ☽ ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1253 Регистрация: 26.8.2009 Репутация: 39 Всего: 112 |
Ну, вообще-то определение «псевдокласса» в Javascript как раз и осуществляется путем написания функции-конструктора, которая создает и инициализирует нужные атрибуты экземпляра, а также добавлением свойств и методов к объекту-прототипу (см. предыдущие сообщения). Ясно, что Javascript пока не обеспечивает поддержку классов, как этого, может быть, хотелось бы. Отсюда, наверное, присказка «псевдо-». Но такая терминология, вообще говоря, используется с указанными оговорками. Так что не стоит придираться к словам. Не об этом же речь.
![]() Это сообщение отредактировал(а) Amphiluke - 14.8.2010, 08:37 |
|||
|
||||
![]() ![]() ![]() |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | JavaScript: для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |