如果我们有以下类(简化示例):
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
)。
因此,我有几个问题:
this
调用类的每个方法?manners
拨打talk
是不合适的?我应该自己设置this
吗? (不确定在这种情况下这是怎么可能的)一般来说,我仍然不知道如何以及何时使用apply
和call
,所以整个主题对我来说非常混乱。每当我遇到这些问题(例如,在事件处理中)遇到麻烦时,我都会使用var that = this;
解决方法,但我认为是时候更深入地理解这个话题了。 。此外,无论如何,这个修复无效。
答案 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)
答案 2 :(得分:0)
了解javascript的一点是,它没有类。 Javascript有对象和函数(函数只是对象)。
this
变量附加到函数,并遵循“调用模式”。根据您调用函数的方式,this
被赋予一定的值。所有函数对象都有call
和apply
方法,用于执行调用它们的函数对象。这些方法的第一个参数指定在执行函数期间将被引用为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
。