使用$ .ajax发送基于原型的类时遇到问题

时间:2013-09-29 18:56:06

标签: javascript jquery ajax

如果我们有以下类(简化示例):

function MyClass() {
    this.greeting = "Where is the ice cream?";
}

MyClass.prototype.talk = function() {
    console.log(this.manners(this.greeting));
}

MyClass.prototype.manners = function(phrase) {
    return "I beg your pardon. " + phrase;
}

然后我们尝试通过ajax发送它,如下所示:

var c = new MyClass();
$.ajax({
    data : c,
    url : "ajax.php",
    dataType : "json",
    type : "post"
});

我从MyClass.prototype.talk收到一个例外,说“this.manners不是函数”。我得到此异常的原因是,由于某种原因,ajax调用强制调用MyClass上的所有方法,this Window(而不是实例) MyClass)。

因此,我有几个问题:

  • 为什么ajax调用强制使用Window this调用类的每个方法?
  • 以我的方式从manners拨打talk是不合适的?我应该自己设置this吗? (不确定在这种情况下这是怎么可能的)

一般来说,我仍然不知道如何以及何时使用applycall,所以整个主题对我来说非常混乱。每当我遇到这些问题(例如,在事件处理中)遇到麻烦时,我都会使用var that = this;解决方法,但我认为是时候更深入地理解这个话题了。 。此外,无论如何,这个修复无效。

3 个答案:

答案 0 :(得分:1)

编辑:虽然方法是正确的,但原型不会继承局部变量,stingify看起来就像最好的路线。

回答问题: 1.'this'总是反映当前的上下文和AJAX转向全局范围,从而导致窗口。 2.合适吗?可能不是。我倾向于以下列方式使用它:

var c = new MyClass();
c.greeting = 'You ate all the ice cream!';
c = c.manners(c.greeting);
$.ajax({
    data : c,
    url : "ajax.php",
    dataType : "json",
    type : "post"
});

以下建议在这种情况下不起作用:

脱离我的头顶;在myClass()

中明确设置'this'
var _that = this;

...用原型方法中的_that替换'this'

在AJAX请求期间,范围丢失并恢复为窗口。在类的顶部定义_that ='this'总是确保范围保持不变。

答案 1 :(得分:1)

我认为您需要序列化您的数据。

data : JSON.stringify(c),

现在似乎是POST:http://jsfiddle.net/JvPym/

我认为thiswindow没有任何问题。

答案 2 :(得分:0)

了解javascript的一点是,它没有类。 Javascript有对象和函数(函数只是对象)。

this变量附加到函数,并遵循“调用模式”。根据您调用函数的方式,this被赋予一定的值。所有函数对象都有callapply方法,用于执行调用它们的函数对象。这些方法的第一个参数指定在执行函数期间将被引用为this上下文的对象,但是如果它为null或未定义,则使用全局对象window

解决此问题的最佳方法是在函数中创建一个内部变量,以便在以后的正确上下文中引用this。下面是一个如何重写它的例子:

function MyClass() {
        var _self = this;  
        this.greeting = "Where is the ice cream?";


    this.talk = function() {
        console.log(_self.manners(this.greeting));
    }

    this.manners = function(phrase) {
        return "I beg your pardon. " + phrase;
    }
}

注意_self如何用于引用正确的上下文。在您的功能中,您只能引用_self而不是this