当我在TypeScript中使用类方法时,我试图捕获this
。
/// <reference path="./typings/async/async.d.ts"/>
import async = require('async');
class Person {
greet(callback) {
if (!this.name) { return callback('name is not defined'); }
console.log('Hello ' + this.name + '!');
return callback();
};
constructor(public name: string) { };
}
var person1 = new Person('John');
var person2 = new Person('Jane');
console.log('Greet one person:');
person1.greet((err) => {
if (err) { return console.error(err); }
return console.log('greeting is done\n');
});
console.log('Greet all peoples:');
async.series([person1.greet, person2.greet], (err) => {
if (err) { return console.error(err); }
return console.log('greetings are done\n');
});
输出:
Greet one person:
Hello John!
greeting is done
Greet all peoples:
name is not defined
当我使用greet
方法作为async.series任务时,上下文不再是Person
实例。
我在post找到了一个解决方案。我可以将greet
方法转换为公共成员并使用lambda function。
greet = (callback) => {
if (!this.name) { return callback('name is not defined'); }
console.log('Hello ' + this.name + '!');
return callback();
};
输出:
Greet one person:
Hello John!
greeting is done
Greet all peoples:
Hello John!
Hello Jane!
greetings are done
问题是greet
不再是Person
原型的一部分,而是实例的成员。
有人有解决办法让greet
成为Person
原型的一部分吗?
答案 0 :(得分:1)
您可以使用bind指定上下文:
async.series([person1.greet.bind(person1), person2.greet.bind(person2)], ...);
答案 1 :(得分:1)
作为Person原型的一部分招呼
没有。这是因为所有实例都prototype
共享。由于只有 one ,因此不能将其绑定到单个实例而不会破坏其他实例。
使用箭头函数将其绑定到this
,而不是让编译器为每个实例绑定它,或者只使用bind
创建函数绑定的副本具体实例。