Javascript对象和异步调用
我正在用javascript尝试一种更面向对象的方法,并通过使用class.prototype实现了一个带有一些方法的类 但我有个问题 我尝试使用myclass中的方法作为ajax调用的成功函数。问题是,当ajax调用该方法时,我不能使用该方法。即:Javascript对象和异步调用,javascript,oop,asynchronous,Javascript,Oop,Asynchronous,我正在用javascript尝试一种更面向对象的方法,并通过使用class.prototype实现了一个带有一些方法的类 但我有个问题 我尝试使用myclass中的方法作为ajax调用的成功函数。问题是,当ajax调用该方法时,我不能使用该方法。即: MyClass.prototype.myMethod = function(data) { this.data = data; /* in here this is the window object */ } var myClass = new
MyClass.prototype.myMethod = function(data)
{
this.data = data; /* in here this is the window object */
}
var myClass = new MyClass();
$.ajax:
success:myClass.myMethod;
我做错什么了吗
编辑:完整的功能尝试
我不是吗
方法
function MyClass()
{
this.name="myclass";
};
MyClass.prototype.print = function()
{
alert(this.name);
};
var myAjax = function(context_,func)
{
$.ajax({
url:"www.google.com",
type: "GET",
context:context_,
complete:function(data){
func(data);
}
});
};
var refreshGroups = function(groups)
{
var myClass = new MyClass();
myAjax(myClass,myClass.print);
return;
}
结果:alert为空JavaScript中的方法实际上并没有以任何深度绑定到对象属性;它们只是价值观。当您像那样引用函数时,设置ajax调用时所涉及的
this
的事实完全丢失了
有一个新的ish API提供帮助:
success: this.myMethod.bind(this) // or myClass.myMethod.bind(myClass) ...
.bind()
方法(来自较新浏览器中的函数原型)返回另一个函数,该函数将调用您的方法,确保在该调用中正确设置了此
MDN网站上有一个版本的“bind”(还有其他版本)。或者,您可以显式地执行相同的操作:
var obj = this;
$.ajax({
// ...
success: function() { obj.myMethod(); },
// ...
});
该“obj”变量是保存此的外部上下文值所必需的
“问题是,当ajax调用该方法时,我不能将其与该方法一起使用。”
使用$.ajax
调用的上下文:
属性
$.ajax({
url:...,
context: myClass,
success: myClass.myMethod
});
或者使用
给定更新的代码,您需要将
func(数据)
更改为从使用context:
设置的调用上下文调用,因此您可以this.func(数据)
var myAjax = function(context_,func)
{
$.ajax({
url:"www.google.com",
type: "GET",
context:context_,
complete:function(data){
this.func(data);
}
});
};
var myAjax = function(context_,func)
{
$.ajax({
url:"www.google.com",
type: "GET",
context:context_,
complete:func
});
};
…但是,由于除了调用传递的函数并传递参数之外,您在匿名函数中没有做任何事情,因此您可以只执行complete:func
var myAjax = function(context_,func)
{
$.ajax({
url:"www.google.com",
type: "GET",
context:context_,
complete:function(data){
this.func(data);
}
});
};
var myAjax = function(context_,func)
{
$.ajax({
url:"www.google.com",
type: "GET",
context:context_,
complete:func
});
};
…并且func
的调用上下文将设置为您传递的对象,并且data
参数仍将传递给函数
当然,这在代码的工作方式上并不是一个问题,因为您已经有了对上下文的封闭引用,所以您可以跳过传递
func
,直接从对象获取它
var myAjax = function(context_) // <-- no function argument needed
{
$.ajax({
url:"www.google.com",
type: "GET",
complete:function(data){
context_.print(data);
}
});
};
var refreshGroups = function(groups)
{
var myClass = new MyClass();
myAjax(myClass); // <--just pass the object
return;
}
var myAjax=function(context)//您的意思是:$.ajax({success:myClass.myMethod;})代码>?Javascript不是面向对象的,因此抽象很快就会中断。myMethod
函数不知道它只作用于类,它只是一个方法。您需要将调用封装在一个匿名函数中,该函数调用对象上的方法。将myClass.myMethod
替换为function(){myClass.myMethod();}
@davidjavascript是面向对象的,它只是缺少绑定方法,因为它以一种奇怪的方式绑定了这个
。该死,我需要把它写在我的手背上或其他什么东西上:-)@怀疑者:我需要看到更多的代码。您提供的内容看起来像是实际文档的一小部分。发布更多代码,我可能会提供帮助。@amnotiam更新,如果你能看一看,那就太好了:)@Douber:你需要这个<代码>完成:函数(数据){this.func(数据);}
,或者更好,就是这个<代码>完成:func
。我会更新我的答案。