Javascript 从方法中的另一个方法处理类方法和属性的正确方法
假设我有一个包含两个方法/函数的类。一个方法利用另一个类的函数——在本例中是JQuery的ajax调用。在这个函数中,我想处理我自己类的一个方法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
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*
});
}