将构造对象的方法传递给 JavaScript 中的函数
Passing method of a constructed object to a function in JavaScript
下面的代码适用于常规函数,但不适用于对象方法。
我收到以下错误:
return this.anotherService.get1(start, end);
^
TypeError: Cannot read property 'anotherService' of undefined
我如何重写代码,使 getTransactions
成为执行作为参数传递的不同方法的通用辅助函数?
class Service {
constructor(arg1) {
this.anotherService= new AnotherService(arg1);
}
getMethod1(start, end) {
return this.anotherService.get1(start, end);
}
getMethod2(start, end) {
return this.anotherService.get2(start, end);
}
}
function getTransaction1(arg1, arg2, arg3) {
let service = new Service(arg1);
getTransactions(arg2, arg3, service.getMethod1);
};
function getTransaction2(arg1, arg2, arg3) {
let service = new Service(arg1);
getTransactions(arg2, arg3, service.getMethod2);
};
function getTransactions(arg2, arg3, func) {
let start = ......;
let end = ........;
func(start, end).then(data => {
res.json(data);
}).catch(console.log);
};
您可以使用 Function#bind
来处理:
function getTransaction1(arg1, arg2, arg3) {
let service = new Service(arg1);
getTransactions(arg2, arg3, service.getMethod1.bind(service));
// -------------------------------------------^^^^^^^^^^^^^^
}
function getTransaction2(arg1, arg2, arg3) {
let service = new Service(arg1);
getTransactions(arg2, arg3, service.getMethod2.bind(service));
// -------------------------------------------^^^^^^^^^^^^^^
}
Function#bind
returns 一个新函数,当被调用时,将调用原始函数 this
设置为您传递给 bind
的对象。 (您还可以将其他参数传递给 bind
,但这与此处无关。)
或者,当然,您可以在构造函数中使用粗箭头函数创建 getMethod1
和 getMethod2
,这会获得词法 this
绑定:
class Service {
constructor(arg1) {
this.anotherService= new AnotherService(arg1);
this.getMethod1 = (start, end) => {
return this.anotherService.get1(start, end);
};
this.getMethod2 = (start, end) => {
return this.anotherService.get2(start, end);
};
}
}
...在这种情况下,您根本不必更改 getTransaction1
和 getTransaction2
。
旁注:函数 声明(您在 getTransaction1
和 getTransaction2
中使用的)不是语句,因此它们不是以分号结束。
下面的代码适用于常规函数,但不适用于对象方法。
我收到以下错误:
return this.anotherService.get1(start, end);
^
TypeError: Cannot read property 'anotherService' of undefined
我如何重写代码,使 getTransactions
成为执行作为参数传递的不同方法的通用辅助函数?
class Service {
constructor(arg1) {
this.anotherService= new AnotherService(arg1);
}
getMethod1(start, end) {
return this.anotherService.get1(start, end);
}
getMethod2(start, end) {
return this.anotherService.get2(start, end);
}
}
function getTransaction1(arg1, arg2, arg3) {
let service = new Service(arg1);
getTransactions(arg2, arg3, service.getMethod1);
};
function getTransaction2(arg1, arg2, arg3) {
let service = new Service(arg1);
getTransactions(arg2, arg3, service.getMethod2);
};
function getTransactions(arg2, arg3, func) {
let start = ......;
let end = ........;
func(start, end).then(data => {
res.json(data);
}).catch(console.log);
};
您可以使用 Function#bind
来处理:
function getTransaction1(arg1, arg2, arg3) {
let service = new Service(arg1);
getTransactions(arg2, arg3, service.getMethod1.bind(service));
// -------------------------------------------^^^^^^^^^^^^^^
}
function getTransaction2(arg1, arg2, arg3) {
let service = new Service(arg1);
getTransactions(arg2, arg3, service.getMethod2.bind(service));
// -------------------------------------------^^^^^^^^^^^^^^
}
Function#bind
returns 一个新函数,当被调用时,将调用原始函数 this
设置为您传递给 bind
的对象。 (您还可以将其他参数传递给 bind
,但这与此处无关。)
或者,当然,您可以在构造函数中使用粗箭头函数创建 getMethod1
和 getMethod2
,这会获得词法 this
绑定:
class Service {
constructor(arg1) {
this.anotherService= new AnotherService(arg1);
this.getMethod1 = (start, end) => {
return this.anotherService.get1(start, end);
};
this.getMethod2 = (start, end) => {
return this.anotherService.get2(start, end);
};
}
}
...在这种情况下,您根本不必更改 getTransaction1
和 getTransaction2
。
旁注:函数 声明(您在 getTransaction1
和 getTransaction2
中使用的)不是语句,因此它们不是以分号结束。