Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript对象和异步调用_Javascript_Oop_Asynchronous - Fatal编程技术网

Javascript对象和异步调用

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

我正在用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();
$.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
。我会更新我的答案。