Классы в JS

Q_BASIC

Хранитель порядка
Регистрация
30 Ноя 2013
Сообщения
516
Реакции
1.240
Приветствую,

Как в этом коде из функции slide обратиться к frame_num? Сейчас this, как я понял, к setInterval относится.

Код:
function slider(selector, time)
{
    this.obj = $(selector);
    this.frame_num = 1;
    this.frame_width = $('.slider-block', this.obj).width();
   
    console.log(this.frame_width);
   
    this.slide = function()
    {
        this.frame_num++;
        console.log(this.frame_num);
    }
   
    setInterval(this.slide, time);
}
 
this относится к текущему объекту, через точку вызывается метод или свойство, т.е. получить или установить значение свойства можно так:

Код:
alert( this.frame_num ); // выкинет алерт с значением свойства

или

Код:
this.frame_num = 'xxx'

чтобы задать значение

this - работает внутри класса. если нужно вне класса получить/изменить/вызвать - нужно создать объект класса, вот тебе Для просмотра ссылки Войди или Зарегистрируйся набросал
 
this относится к текущему объекту, через точку вызывается метод или свойство, т.е. получить или установить значение свойства можно так:

Код:
alert( this.frame_num ); // выкинет алерт с значением свойства

или

Код:
this.frame_num = 'xxx'

чтобы задать значение

this - работает внутри класса. если нужно вне класса получить/изменить/вызвать - нужно создать объект класса, вот тебе Для просмотра ссылки Войди или Зарегистрируйся набросал

для автора ваш пример - слишком сферический) Верно описали, но setInterval классы вообще не трогает, а оперирует переданной функцией, в другом контексте. Если бы автор перешёл по первой ссылке в гугле (Для просмотра ссылки Войди или Зарегистрируйся ) по этой функции, то увидел бы как раз объяснение как работать с this в этой функции.
 
Поскольку setInterval имеет свой собственный scope, то на самом деле ничего у вас не получится, потому что this.frame_num++ вызывается из setInterval.

Что это означает? При вызове setInterval код не знает о существовании родительской функции slider и о том, что frame_num равно 1. Поэтому при вызове setInterval frame_num будет равняться undefined, а при инкременте undefined вы получите NaN.

Можно сделать так:

Внутри функции slider создать новую переменную для временной передачи scope:

Код:
function slider(selector, time)
{
    var that = this;
    this.obj = $(selector);
    this.frame_num = 1;
    this.frame_width = $('.slider-block', this.obj).width();
   
   
    console.log(this.frame_width);
   
    this.slide = function()
    {
        that.frame_num++;
        console.log(this.frame_num);
    }
   
    setInterval(this.slide, time);
}

Тогда этой проблемы не будет и можно все спокойно вызывать.
 
Назад
Сверху