Объект JavaScript обязательная проблема в определениях прототипа функции

Я пытаюсь выяснить правильное место, чтобы обязать прототипа функции быть названным позже. Полный код примера может быть найден здесь:

http://www.iprosites.com/jso/

Мой пример JavaScript является очень простым:

function Obj(width, height){
    this.width = width;
    this.height = height;
}

Obj.prototype.test = function(){
    var xhr=init();
    xhr.open('GET', '?ajax=test', true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    xhr.onreadystatechange = function() {
        if (xhr.responseText == '403') {
            window.location.reload(false);
        }
        if (xhr.readyState == 4 && xhr.status == 200) {
            this.response = parseResponse(xhr.responseText);
            document.getElementById('resp').innerHTML = this.response.return_value;
            this.doAnotherAction();
        }
    };
    xhr.send();
}

Obj.prototype.doAnotherAction = function(){
    alert('Another Action Done');
}


var myo = new Obj(4, 6);

При попытке выполнить myo.test () в Firebug, то Вы доберетесь "this.doAnotherAction, не функциональный" ответ. Эти 2 функции поддержки init () и parseResponse () могут быть найдены в ссылке test.js, если Вы хотите просмотреть их, но не должны слишком относиться к этой проблеме. Я подтвердил, что this.doAnotherAction () думает, что "это" - объект XMLHttpResponse как ожидалось от теста instanceof.

Кто-либо может помочь с некоторым пониманием на направлении с привязкой? Все, что я попробовал, кажется, не работает!

Я действительно использую Mootools, хотя библиотека не присутствует в этом примере.

Заранее спасибо,

Arion

1
задан Arion 10 June 2010 в 22:16
поделиться

2 ответа

this внутри xhr.onreadystatechange не относится к экземпляру Obj . вам нужно записать это вне функции в локальную переменную, а затем использовать это внутри xhr.onreadystatechange . то есть

Obj.prototype.test = function(){
    var obj = this,
        xhr=init();
    xhr.open('GET', '?ajax=test', true);
    xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');
    xhr.onreadystatechange = function() {
        if (xhr.responseText == '403') {
            window.location.reload(false);
        }
        if (xhr.readyState == 4 && xhr.status == 200) {
            this.response = parseResponse(xhr.responseText);
            document.getElementById('resp').innerHTML = this.response.return_value;
            obj.doAnotherAction();
        }
    };
    xhr.send();
}

Протестируйте это на своей тестовой странице, вставив вышеуказанное в консоль, а затем запустив myo.test () :)

1
ответ дан 2 September 2019 в 23:49
поделиться

ECMAScript 5-е изд. заимствовал метод bind для функций из инфраструктуры Prototype. Вы можете включить его в свой код, который определит метод привязки, если он еще не присутствует.

if (!Function.prototype.bind)
{
    Function.prototype.bind = function() {
        var fn = this, 
            args = Array.prototype.slice.call(arguments), 
            object = args.shift();

        return function() {
            return fn.apply(object,
                args.concat(Array.prototype.slice.call(arguments)));
        };
    };
}

После определения вы можете связать анонимную функцию внутри обратного вызова onreadystatechange с объектом Obj.

xhr.onreadystatechange = function() {
    ...
}.bind(this);
1
ответ дан 2 September 2019 в 23:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: