Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> this.x is undefined в Cls.prototype.foo, Необъяснимое поведение 
:(
    Опции темы
JavaCraft
Дата 12.11.2009, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 8.2.2007

Репутация: нет
Всего: 1



Сделал код четко по книге, где ошибка, не вижу. Выжимка кода:
Код

function My(_elem) {
    this.elem  = _elem;
    alert(_elem.id);      //OK!
    alert(this.elem.id); //OK!
}
My.prototype.callback = function(o){
    alert('in = '+o.param); //OK!
    alert(this); // Error - object:Object
    alert('elem = ' + this.elem); // Error - undefined
}
My.prototype.over = function(o) {
...
     $.post('/url/',{param:o.id},this.callback,'json')
...
}

var div = null
start(){
 div = new My(document.getElementById("id0"));
}

Код

<body onload="start()">
...
 <td id="tdx" onmouseover="div.over(this)">...</td>
...
 <div id="id0"></div>
...
</body>


При создании экземпляра, свойства экземпляра инициализируются правильно.
Вызов вункции выполняется, json запрос выполняется, callback вызывается, параметр полученный с сервера правильный.
Однако, this ссылается на object:Object а не на object:My

Ожидалось, что this будет ссылаться на экземпляр My, т.е. на div
Я нигде явно не создаю других объектов My

... позже
Перепробовал три разных способа объявления callback метода экземпляра класса, результат одинаковый.


... позже
Но если заменить $.post функцию на заглушку, вот так:
Код

            this.callback({param:"xxx"});

То проблема исправляется и внутри callback this указывает на объект div и все его свойства определены.
Выходит, проблема в способе вызова колбек функций в функции $.post jQuery!


... позже
Аналогичная проблема возникает при использовании setTimeout(this.callback,1000).
Только теперь контекст выполнения callback меняется на Windows а не на Object

Помогает только хак с инлайновой функцией и локальной переменной, но ведь не всё можно/нужно в инлайн пихать.

Может кто-нибудь подскажет в чем дело и как победить проблему?
Нужно срочно.

Это сообщение отредактировал(а) JavaCraft - 12.11.2009, 18:06
PM MAIL   Вверх
JavaCraft
Дата 12.11.2009, 19:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 8.2.2007

Репутация: нет
Всего: 1



Пока задачу удалось решить очень частным и кривым способом путем создания глобальной переменной _this в конструкторе класса и присвоением ей this экземпляра.
Код

function My(elem){
_this = this; // _this без var!
}


В callback методах, вместо this использовать _this.
В остальных, this.
Боюсь, что будет работать только для одного(последнего) экземпляра.

Проблема остается открытой.
Хочется нормального способа.
PM MAIL   Вверх
vasac
Дата 12.11.2009, 21:24 (ссылка) |  (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1060
Регистрация: 4.5.2006

Репутация: нет
Всего: 36



Код

My.prototype.over = function(o) {

    var _this = this;

     $.post('/url/',{param:o.id}, (function() {return _this.callback;}),'json');
}


Если это jQuery или подобное (вижу $), там должны быть методы для более простой привязки функций к объектам.
PM WWW   Вверх
JavaCraft
Дата 13.11.2009, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 139
Регистрация: 8.2.2007

Репутация: нет
Всего: 1



Цитата(vasac @ 12.11.2009,  21:24)
Код

My.prototype.over = function(o) {

    var _this = this;

     $.post('/url/',{param:o.id}, (function() {return _this.callback;}),'json');
}


Если это jQuery или подобное (вижу $), там должны быть методы для более простой привязки функций к объектам.

Я знаю, там есть много универсальных решений. Я ведь не зря показал в коде prototype, значит хочу сделать код максимально повторно используемым, а не копируемым. Ну и хочется самому реализовать, для практики.

Сделал в точности по вашему примеру.
И что-то Ваш код тихо не работает. Функция callback не выполняется. Или $.post не может использовать такую возвращаемую функцию или я где-то напортачил.

Со вчерашнего дня, пока нашел, по моему, самый оптимальный компромис между наследованием и копированием.
Код

function My(element) {
    element._this = this;
    this.callback = function(o){element._this._callback(o);} //Вложенная функция заглушка, с замыканием <element>
}
My.prototype._callback = function(o){
  //код обработки ответа <o>
}
My.prototype.over = function(o) {
...
     $.post('/url/',{param:o.id},this.callback,'json')
...
}


Идея в том, что в месте определения внутри класса вложенная функция видит входные параметры конструктора и выполняет замыкание.
В свою очередь, у элемента из входных параметров, создано новое свойство и ему присвоена ссылка на экземпляр.
Вложенная функция нужна только как заглушка, для организации замыкания и в ней реализуется минимальный код.
Основной код вынесен в наследуемую функцию.
Результат работы не будет зависеть от контекста вызова вложенной функции.
Таким образом задача решена.

Это сообщение отредактировал(а) JavaCraft - 13.11.2009, 10:50
PM MAIL   Вверх
youri
Дата 13.11.2009, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 17.4.2004

Репутация: 2
Всего: 16



Цитата(JavaCraft @  12.11.2009,  15:29 Найти цитируемый пост)
Однако, this ссылается на object:Object а не на object:MyОжидалось, что this будет ссылаться на экземпляр My, т.е. на div

Цитата(JavaCraft @  12.11.2009,  15:29 Найти цитируемый пост)
Аналогичная проблема возникает при использовании setTimeout(this.callback,1000).Только теперь контекст выполнения callback меняется на Windows а не на Object

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

Цитата(JavaCraft @  12.11.2009,  15:29 Найти цитируемый пост)
То проблема исправляется и внутри callback this указывает на объект div и все его свойства определены.Выходит, проблема в способе вызова колбек функций в функции $.post jQuery!

проблема в том, как ты организуешь свой код

Цитата(JavaCraft @  13.11.2009,  10:06 Найти цитируемый пост)
Я ведь не зря показал в коде prototype, значит хочу сделать код максимально повторно используемым, а не копируемым. 

Есть два основных подхода: создание своего объекта по требованию (jQuery) или добавление методов к элементам (mootools). Посмотри, как это реализовано в этих фреймворках

Цитата(JavaCraft @  13.11.2009,  10:06 Найти цитируемый пост)
Идея в том, что в месте определения внутри класса вложенная функция видит входные параметры конструктора и выполняет замыкание.

функции не выполняют замыкание, замыкание - это и есть функция определенного рода
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0547 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.