我试图找出绑定函数原型的合适位置,以便稍后调用。可以在此处找到示例的完整代码:
我的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);
如果你试图在Firebug中运行myo.test(),你会得到“this.doAnotherAction不是函数”的响应。如果您希望查看它们,可以在test.js链接中找到2个支持函数init()和parseResponse(),但不应该与此问题过于相关。我已经确认this.doAnotherAction()认为“this”是XMLHttpResponse对象,正如testof instanceof所期望的那样。
任何人都可以帮助对绑定方向有所了解吗?我试过的一切似乎都没有用!
我确实使用了Mootools,尽管这个例子中没有库。
提前致谢,
阿里昂
答案 0 :(得分:1)
this
内的 xhr.onreadystatechange
未引用Obj
的实例。你需要在局部变量中捕获函数之外的this
,然后在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 :(得分:1)
ECMAScript第5版。已经从Prototype框架的函数中借用了bind
方法。您可以将它包含在您的代码中,如果它尚未存在,将定义绑定方法。
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);