![]() |
|
Модераторы: Sardar, Aliance |
![]()
|
|
| JavaCraft |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 8.2.2007 Репутация: нет Всего: 1 |
Сделал код четко по книге, где ошибка, не вижу. Выжимка кода:
При создании экземпляра, свойства экземпляра инициализируются правильно. Вызов вункции выполняется, json запрос выполняется, callback вызывается, параметр полученный с сервера правильный. Однако, this ссылается на object:Object а не на object:My Ожидалось, что this будет ссылаться на экземпляр My, т.е. на div Я нигде явно не создаю других объектов My ... позже Перепробовал три разных способа объявления callback метода экземпляра класса, результат одинаковый. ... позже Но если заменить $.post функцию на заглушку, вот так:
То проблема исправляется и внутри callback this указывает на объект div и все его свойства определены. Выходит, проблема в способе вызова колбек функций в функции $.post jQuery! ... позже Аналогичная проблема возникает при использовании setTimeout(this.callback,1000). Только теперь контекст выполнения callback меняется на Windows а не на Object Помогает только хак с инлайновой функцией и локальной переменной, но ведь не всё можно/нужно в инлайн пихать. Может кто-нибудь подскажет в чем дело и как победить проблему? Нужно срочно. Это сообщение отредактировал(а) JavaCraft - 12.11.2009, 18:06 |
||||||
|
|||||||
| JavaCraft |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 8.2.2007 Репутация: нет Всего: 1 |
Пока задачу удалось решить очень частным и кривым способом путем создания глобальной переменной _this в конструкторе класса и присвоением ей this экземпляра.
В callback методах, вместо this использовать _this. В остальных, this. Боюсь, что будет работать только для одного(последнего) экземпляра. Проблема остается открытой. Хочется нормального способа. |
|||
|
||||
| vasac |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1060 Регистрация: 4.5.2006 Репутация: нет Всего: 36 |
Если это jQuery или подобное (вижу $), там должны быть методы для более простой привязки функций к объектам. |
|||
|
||||
| JavaCraft |
|
||||||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 139 Регистрация: 8.2.2007 Репутация: нет Всего: 1 |
Я знаю, там есть много универсальных решений. Я ведь не зря показал в коде prototype, значит хочу сделать код максимально повторно используемым, а не копируемым. Ну и хочется самому реализовать, для практики. Сделал в точности по вашему примеру. И что-то Ваш код тихо не работает. Функция callback не выполняется. Или $.post не может использовать такую возвращаемую функцию или я где-то напортачил. Со вчерашнего дня, пока нашел, по моему, самый оптимальный компромис между наследованием и копированием.
Идея в том, что в месте определения внутри класса вложенная функция видит входные параметры конструктора и выполняет замыкание. В свою очередь, у элемента из входных параметров, создано новое свойство и ему присвоена ссылка на экземпляр. Вложенная функция нужна только как заглушка, для организации замыкания и в ней реализуется минимальный код. Основной код вынесен в наследуемую функцию. Результат работы не будет зависеть от контекста вызова вложенной функции. Таким образом задача решена. Это сообщение отредактировал(а) JavaCraft - 13.11.2009, 10:50 |
||||||
|
|||||||
| youri |
|
||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 740 Регистрация: 17.4.2004 Репутация: 2 Всего: 16 |
ты просто передаешь функцию, нигде не указывая, для какого объекта она должна выполниться проблема в том, как ты организуешь свой код
Есть два основных подхода: создание своего объекта по требованию (jQuery) или добавление методов к элементам (mootools). Посмотри, как это реализовано в этих фреймворках
функции не выполняют замыкание, замыкание - это и есть функция определенного рода |
||||||||
|
|||||||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | JavaScript: для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |