Я пытаюсь выяснить правильное место, чтобы обязать прототипа функции быть названным позже. Полный код примера может быть найден здесь:
Мой пример 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
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 ()
:)
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);