3

我写了一些像这样的面向对象的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 内部失败。进行此函数调用的正确方法是什么?

4

3 回答 3

5

this在您的回调函数与this引用不同SomeFunc,请尝试执行以下操作:

this.SomeOtherFunc(){
    var thatFunc = this; //get hold of this
    return $.ajax({
        <some restful call>
    }).done(function(){
        var localvar = thatFunc.SomeFunc(<value obtained by restful call>);
        <some operations with localvar>;
    });
};
于 2013-09-09T10:45:51.747 回答
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);
于 2013-09-09T10:49:04.267 回答
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.

希望有帮助。

于 2013-09-09T11:08:56.760 回答