Javascript 从方法中的另一个方法处理类方法和属性的正确方法

Javascript 从方法中的另一个方法处理类方法和属性的正确方法,javascript,class,oop,Javascript,Class,Oop,假设我有一个包含两个方法/函数的类。一个方法利用另一个类的函数——在本例中是JQuery的ajax调用。在这个函数中,我想处理我自己类的一个方法 class priceSearch { this foobar = "null"; loadStuff() { $.ajax({url: requestUrl}) .done(function(response){ this.processStuff(response); conso

假设我有一个包含两个方法/函数的类。一个方法利用另一个类的函数——在本例中是JQuery的ajax调用。在这个函数中,我想处理我自己类的一个方法

class priceSearch {


  this foobar = "null";

  loadStuff() {

    $.ajax({url: requestUrl})
      .done(function(response){

        this.processStuff(response);
        console.log(foobar); // -> undefined
      });

  }

  processStuff(stuff) {

    console.log(stuff);

  }

}
但这将导致

processStuff未定义

显然,因为processStuff不是ajax.done的一部分,“this”引用了ajax.done

那么,如何处理父类的类方法呢


属性相同:Ajax调用中的foobar将返回“undefined”。

您正在向Ajax传递一个匿名函数。完成后,
不会在类和匿名函数之间共享。您可以:

  • 在类中声明一个函数
    handleResponse
    ,并通过调用
    ajax.done(this.handleResponse)
  • 用于更改匿名函数中的
  • 使用时,它们共享范围和
    实例,而不是定义自己的,例如:

  • 代码进入匿名函数时:

    .done(function(response){
       *this* is no longer referring to the class but "this" function
    });
    
    ES6的解决方案是避免对done使用匿名函数,而是使用数组函数

    .done( (response) => {
        this.processStuff(response); *this* still refers to class
    });
    
    为了给你另一个视角,在过去,我们会声明一个局部变量(你的方法的局部变量)来保存另一个方法

    loadStuff() {
        var psHolder = this.processStuff;
        $.ajax({url: requestUrl})
          .done(function(response){
             psHolder(response);  *this should also work*
          });
    
    }
    

    尝试使用arrow函数
    .done((response)=>{/*Body*/})
    ,如果我没有弄错的话,它会将它绑定到您的类,而不是
    jQuery
    对象。函数匿名这一事实的可能重复与此无关,尝试给它一个名称,您会看到完全相同的问题。问题是,它作为回调传递给
    done
    ,因此它控制函数的调用方式以及它的
    this
    是什么。(特别是,它不会在
    priceSearch
    “类”的上下文中调用)谢谢#3-Arraow函数实现了这一点。对我来说,这似乎也是最干净的方法。@RobinZigmond函数在默认情况下有自己的
    这个
    ,给它起个名字没有什么区别。我只是想声明,
    这个
    在类和一个未声明为其方法(或声明为箭头函数)的函数之间不共享。但是,将它传递给ajax.done并不是导致它改变的原因。您可以声明一个函数并在类的方法中调用它,它仍然会有一个不同的
    this
    。另外,您可以声明一个类方法
    handleResponse
    并像ajax.done(this.handleResponse)一样传递它,它将拥有正确的
    this
    函数“它自己的<代码>这<代码>*虽然。
    this
    的值完全取决于函数的调用方式-如果以不同的方式调用,同一个函数可能会出现多个不同的值。但对我来说,它似乎不干净,因为有一些属性和方法我必须像这样处理。
    loadStuff() {
        var psHolder = this.processStuff;
        $.ajax({url: requestUrl})
          .done(function(response){
             psHolder(response);  *this should also work*
          });
    
    }