ES6方法获得null"this",类变量不可访问

ant*_*nus 11 node.js ecmascript-6 babeljs

我正在使用ES6类在Node中捆绑一些功能.这是(基本上)它的样子:

class processDocs {
  constructor(id) {
    this.id = id;
    // console.log(this) returns { id: id }
  }

  getDocs(cb) {
    // console.log(this) returns null
    docs
      .query(qb => {
         qb.where('id', this.id);
      })
      .fetch()
      .then(function(documents) {
        cb(null, documents);
      })
    ;
  }

  alterDocs(documents, cb) {
    //some logic
  }

  reindexSearch(cb) {
    //some logic
  }

  process() {
    // console.log(this) returns { id: id }
    async.waterfall([
      this.getDocs,
      this.alterDocs,
      this.reindexSearch
    ]);
  }
}


export default processDocs;
Run Code Online (Sandbox Code Playgroud)

我认为使用ES6类,分配公共变量的方法是简单引用this,通过构造函数初始化这些变量的方式正是它在我的类定义中显示的方式.

这是我如何调用类(在单独的文件中):

var Processor = require('./processDocs');

var pr = new Processor(id);
var docs;
pr.process();
Run Code Online (Sandbox Code Playgroud)

这是问题,当我从构造函数中console.log出来时this,我得到了我{ id: id }预测的价值; 然而,每当我退出thisgetDocs时候process运行,它为空.但是,当我退出thisprocess()瀑布前,我收到我原来的对象.

这有什么理由吗?

顺便说一句,我正在使用node:v0.10.33和babel-node 4.6.6,我用--harmony旗帜运行babel-node .在有人要求之前,我无法更新到更新的Node版本,因为存在一个主要的依赖关系v0.10.x.

编辑我能够创建一个解决方法,但它不是非常类似es6.问题似乎与async.waterfall.我不得不用a .bind来修复它:

    async.waterfall([
      this.getDocs.bind(this),
      this.alterDocs.bind(this),
      this.reindexSearch.bind(this)
    ]);
Run Code Online (Sandbox Code Playgroud)

lib*_*bik 5

ES6并未更改“ this”的工作方式,因此它取决于“在何处调用它”的上下文,而不是“始终具有相同”的值。这是很不直观的,在其他语言中并不常见。

考虑这个例子

class processDocs {
  constructor(id) {
    this.id = id;
    console.log(this)
  }

  getDocs(cb) {
    console.log(this)
  }

  alterDocs(documents, cb) {
    //some logic
  }

  reindexSearch(cb) {
    //some logic
  }

  process() {
    console.log(this)
  }
}

var process = new processDocs(10);
var docs = process.getDocs(function(){});
var processInstance = process.process();

var docsAsFunction = process.getDocs;
docsAsFunction(function(){});
Run Code Online (Sandbox Code Playgroud)

输出是

processDocs {id: 10}
processDocs {id: 10}
processDocs {id: 10}
undefined
Run Code Online (Sandbox Code Playgroud)

如您所见,最后一个是未定义的,它称为“ docsAsFunction”,因为您没有直接从其类中调用该函数,因此上下文有所不同。

您可以在这里阅读例如