Car*_*ers 7 javascript ajax prototype callback
我正忙着用Java包围原型.
以前我在调用这样的东西时遇到了麻烦:
o = new MyClass();
setTimeout(o.method, 500);
Run Code Online (Sandbox Code Playgroud)
我被告知我可以使用以下方法修复它:
setTimeout(function() { o.method(); }, 500);
Run Code Online (Sandbox Code Playgroud)
这很有效.我现在遇到了一个不同的问题,我想我可以用同样的方式解决它,只需要放入一个匿名函数.我的新问题是:
MyClass.prototype.open = function() {
$.ajax({
/*...*/
success: this.some_callback,
});
}
MyClass.prototype.some_callback(data) {
console.log("received data! " + data);
this.open();
}
Run Code Online (Sandbox Code Playgroud)
我发现,内体MyClass.prototype.some_callback的this关键字不参照实例的MyClass该方法被调用时,而这似乎是jQuery的Ajax请求(这是一个包含XHR对象的对象和所有参数我的ajax电话,除其他外).
我试过这样做:
$.ajax({
/* ... */
success: function() { this.some_callback(); },
});
Run Code Online (Sandbox Code Playgroud)
但我得到错误:
Uncaught TypeError: Object #<an Object> has no method 'handle_response'
我不确定如何正确地做到这一点.我是JavaScript的新手和原型的概念 - 有时类似行为的类 - 但通常不会让我感到困惑.
那么这样做的正确方法是什么?我是否试图强制JavaScript进入一个不属于它的范例?
gbl*_*zex 16
我是否试图强制JavaScript进入一个不属于它的范例?
当你谈论类是的时候.
那么这样做的正确方法是什么?
首先,您应该了解this关键字可以包含哪种值.
简单的函数调用
myFunc();- this将引用全局对象(又名window)[1]
函数调用作为对象的属性(又称方法)
obj.method();- this会参考obj
函数调用new运算符
new MyFunc();- this将参考new instance正在创建的
现在让我们看看它如何适用于您的情况:
MyClass.prototype.open = function() {
$.ajax({ // <-- an object literal starts here
//...
success: this.some_callback, // <- this will refer to that object
}); // <- object ends here
}
Run Code Online (Sandbox Code Playgroud)
如果要调用some_callback当前实例的方法,则应该保存对该实例的引用(对于一个简单的变量).
MyClass.prototype.open = function() {
var self = this; // <- save reference to the current instance of MyClass
$.ajax({
//...
success: function () {
self.some_callback(); // <- use the saved reference
} // to access instance.some_callback
});
}
Run Code Online (Sandbox Code Playgroud)
[1]请注意,在新版本(ES 5 Str.)案例1将导致this价值undefined
[2]还有一种情况是你使用call或apply调用给定的函数this