Javascript: Как получить доступ к атрибуту класса из функции в одной из функций класса - PullRequest
4 голосов
/ 09 января 2009

В рамках определенной функции класса мне нужно использовать setInterval, чтобы прервать выполнение кода. Однако внутри функции setInterval «this» больше не относится к классу «myObject». Как я могу получить доступ к переменной "name" из функции setInterval?

function myObject() {
    this.name = "the name";
}

myObject.prototype.getName = function() {
    return this.name;
}

myObject.prototype.test = function() {
    // this works
    alert(this.name);

    var intervalId = setInterval(function() {
        // this does not work
        alert(this.name);

        clearInterval(intervalId);
    },0);
}

Ответы [ 4 ]

12 голосов
/ 09 января 2009
myObject.prototype.test = function() {
    // this works
    alert(this.name);
    var oThis = this;
    var intervalId = setInterval(function() {
        // this does not work
        alert(oThis.name);

        clearInterval(intervalId);
    },0);
}

Это должно работать. Анонимная функция «this» - это не то же самое, что «this» вашего myObject.

1 голос
/ 09 января 2009

Вот прототип функции связывания

Function.prototype.bind = function( obj ) {
    var _this = this;
    return function() {
        return _this.apply( obj, arguments );
    }
}
0 голосов
/ 10 января 2009

Обратите внимание, что ответ s13james является неполным в том смысле, что bind() не является стандартной функцией и должен быть предоставлен в другом месте - один из способов - использование инфраструктуры Javascript prototype.js, а другой - сделать это самостоятельно, используя пример кода meouw.

Если вы не используете bind() (что должно быть замечательно), то ответ djangel - это то, что вы могли бы сделать, и то, чем я чаще всего занимаюсь.

0 голосов
/ 09 января 2009

Для Prototype используется привязка:

function myObject() {
    this.name = "the name";
}

myObject.prototype.getName = function() {
    return this.name;
}

myObject.prototype.test = function() {
    // this works
    alert(this.name);

    var intervalId = setInterval(function() {
        // this does not work
        alert(this.name);

        clearInterval(intervalId);
    }.bind(this),0);
}
...