TypeScript:如何捕获'这个'当我使用类方法时?

时间:2015-08-17 09:49:19

标签: class asynchronous methods lambda typescript

当我在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原型的一部分吗?

2 个答案:

答案 0 :(得分:1)

您可以使用bind指定上下文:

async.series([person1.greet.bind(person1), person2.greet.bind(person2)], ...);

答案 1 :(得分:1)

  

作为Person原型的一部分招呼

没有。这是因为所有实例都prototype 共享。由于只有 one ,因此不能将其绑定到单个实例而不会破坏其他实例。

使用箭头函数将其绑定到this,而不是让编译器为每个实例绑定它,或者只使用bind创建函数绑定的副本具体实例。