我已经编写了一些面向对象的Javascript,如下所示:
function MyClass(){
this.SomeFunc(arg1){
result = <some processing on arg1>;
return result;
};
this.SomeOtherFunc(){
return $.ajax({
<some restful call>
}).done(function(){
var localvar = this.SomeFunc(<value obtained by restful call>);
<some operations with localvar>;
});
};
};
var myObj = new MyClass();
myObj.SomeOtherFunc();
我在Web控制台中收到错误:“this.SomeFunc不是函数”。如果我直接在函数内调用它,就没有问题。调用仅在Ajax内部失败。调用此函数的正确方法是什么?
答案 0 :(得分:4)
this
与引用this
的{{1}}不同,请尝试:
SomeFunc
答案 1 :(得分:0)
由于您正在使用jQuery,您还可以确保允许您传入上下文的$ .proxy(http://api.jquery.com/jQuery.proxy/)方法。例如,你可以做
this.SomeOtherFunc(){
return $.ajax({
<some restful call>
}).done($.proxy(function(){
var localvar = thatFunc.SomeFunc(<value obtained by restful call>);
<some operations with localvar>;
}, this)); // Pass in what 'this' should be in method
};
这里,回调函数将以this
执行,引用作为第二个参数传入的对象。
$.proxy(function(){
// do stuff here
}, this);
答案 2 :(得分:0)
考虑主要功能MyClass
是您的构造函数。
这意味着您必须在那里定义SomeFunc
,但是您正在调用它。
这就是您在控制台中显示的问题。
您可以修复定义函数,而不是调用它:
function MyClass(){
// ----------vvvvvvvvvvv was missing
this.SomeFunc = function(arg1) {
result = <some processing on arg1>;
return result;
};
// ---------------vvvvvvvvvvv same here
this.SomeOtherFunc = function() {
var _this = this
return $.ajax({
<some restful call>
}).done(function(){
// ------------v use _this instead of _this
var localvar = _this.SomeFunc(<value obtained by restful call>);
<some operations with localvar>;
});
};
};
var myObj = new MyClass();
myObj.SomeOtherFunc();
定义函数的另一种方法是通过原型:
MyClass = function() { ... }
MyClass.prototype.SomeFunc = function(arg1) {
return <some processing on arg1>
}
MyClass.prototype.SomeOtherFunc = function() {
var _this = this
return $.ajax({ ... }).done(function(data) {
_this.SomeFunc(data)
})
}
主要区别在于,在构造函数中创建函数会为function
的每次调用创建一个新的new MyClass
。
希望有所帮助。