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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Узнать объект-владелец myobj.mousedown.call(myobj) 
V
    Опции темы
fridkaratel
Дата 6.1.2010, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

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



В-общем... при установке интервала через setInterval каким бы не был объект, this всегда будет window, т.е.:
Код

var MyOBJ {
    value: 10,
    Interval: function() {
        this.value += 1;
    }
}
var i = setInterval(MyOBJ.Interval, 1000);

В данном случае, this.value будет undefined, т.к. this указывает на window.

Возникла идея сделать что-то такое:
Код

function setIntervalA(Func, Obj, Time) {
    return setInterval(Func.call(Obj), Time);
}
var i = setIntervalA(MyOBJ.Interval, MyOBJ, 1000);


Но постоянно приходится указывать и функцию, и объект, что, как мне кажется, кривовато...

Можно ли узнать как-то объект, которому принадлежит функция?

Пытался получать ее через arguments[0], но выводится тело функции, а не ее название...

Какие есть варианты?

Это сообщение отредактировал(а) fridkaratel - 6.1.2010, 14:08
PM   Вверх
Amphiluke
Дата 6.1.2010, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


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

Репутация: 35
Всего: 112



smile
Код

var MyOBJ = {
    value: 10,
    Interval: function() {
        this.value += 1;
    }
}
var i = setInterval("MyOBJ.Interval()", 1000);


Это сообщение отредактировал(а) Amphiluke - 6.1.2010, 14:58
PM   Вверх
fridkaratel
Дата 6.1.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

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



Таким образом не подходит, т.к. при вызове происходит eval...
PM   Вверх
Amphiluke
Дата 6.1.2010, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


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

Репутация: 35
Всего: 112



Цитата(fridkaratel @  6.1.2010,  18:53 Найти цитируемый пост)
Таким образом не подходит, т.к. при вызове происходит eval...

Что-то я, тем не менее, не догнал… Что именно не работает?
PM   Вверх
fridkaratel
Дата 6.1.2010, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

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



При таком вызове (когда параметр в виде строки кода) происходит eval, чтобы вызвать функцию...

В некоторых случаях, eval может блокироваться из-за соображений безопасности...
Например, в разного рода приложениях типа Mozilla Prism... Или Adobe Air.. ;)

Поэтому такой вариант попросту не работает smile
PM   Вверх
Amphiluke
Дата 6.1.2010, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


   ☽
***


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

Репутация: 35
Всего: 112



Ну ладно.  :(
А нечто эдакое не подходит?
Код

function MyOBJ() {
    thisAlias = this;
    this.value = 10;
}
MyOBJ.prototype.Interval = function() {thisAlias.value++;}

obj = new MyOBJ();
var i = setInterval(obj.Interval, 1000);

PM   Вверх
segrey
Дата 6.1.2010, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Код

var i = setInterval(function () {MyOBJ.Interval()}, 1000);

PM MAIL   Вверх
fridkaratel
Дата 6.1.2010, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 221
Регистрация: 22.10.2007
Где: Error connect to MySQL Da...

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



@Amphiluke:
Не совсем то, что хотелось бы...

@segrey:
Я так и делаю в данный момент, но хотелось бы как-то удобней сделать, так сказать, расширить...
Например, проблема ведь не только при создании интервалов, но и вот, например:
Код

MyOBJ.prototype.OnClick = function() {
    alert(this);//Будет не [object Object], а [HTMLDivElement]
}
//-------------------------------
$('#mydiv').click(MyOBJ.OnClick);


Хотелось бы упростить запись, чтобы не путаться... ну как-то так:
Код

(function($) {
    $.fn.clickA = function(Action) {
        var caller = /*Как-то извлечь из Action объект-владельца функции*/;
        Action.call(caller);
    };
})(jQuery);
//-------------------------------
MyOBJ.prototype.OnClick = function() {
    alert(this);//Будет не [object Object], а [HTMLDivElement]
}
//-------------------------------
$('#mydiv').clickA(MyOBJ.OnClick);//click => clickA (click Advance), что-то похожее на c++ :)


Это сообщение отредактировал(а) fridkaratel - 6.1.2010, 19:08
PM   Вверх
segrey
Дата 6.1.2010, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Всё же this сендера перекрывать - тоже не вариант, он может понадобиться в обработчиках событий.
Можно к MyOBJ везде обращаться. Либо если боитесь рефакторинга, задать псевдоним для this как описали выше.
Мне нравится такое решение:
Код
var MyOBJ = (function ()
{
    // заодно тут можно хранить приватные свойства
    var self = {
        value: 10,
        Interval: function() {
            self.value += 1;
        }
    }
    
    return self;
})();


Это сообщение отредактировал(а) segrey - 6.1.2010, 21:04
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




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


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

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