node.js - ES6 方法得到一个空值 "this"并且类变量不可访问

标签 node.js ecmascript-6 babeljs

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

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;

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

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

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

var pr = new Processor(id);
var docs;
pr.process();

这是问题所在,当我从构造函数中 console.logthis 时,我得到了我的 { id: id } 值,正如预测的那样;但是,每当我在运行 process 时在 getDocs 中注销 this 时,它都是空的。但是,当我在 waterfall 之前的 process() 中注销 this 时,我得到了我的原始对象。

这有什么原因吗?

顺便说一句,我正在使用 Node :v0.10.33 和 babel-node 4.6.6,我使用 --harmony< 运行 babel-node/标志。在有人问之前,由于主要依赖项卡在 v0.10.x,我无法更新到较新的 Node 版本。

编辑我能够创建一个解决方法,但它不是很像 es6。问题似乎出在 async.waterfall 上。我不得不使用 .bind 来修复它:

    async.waterfall([
      this.getDocs.bind(this),
      this.alterDocs.bind(this),
      this.reindexSearch.bind(this)
    ]);

最佳答案

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(){});

输出是

processDocs {id: 10}
processDocs {id: 10}
processDocs {id: 10}
undefined

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

您可以阅读它,例如 here

关于node.js - ES6 方法得到一个空值 "this"并且类变量不可访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29358481/

相关文章:

javascript - Reactjs + webpack + babel 7 语法错误 : The rest element has to be the last element when destructing

node.js - 如何在没有任何 babel 依赖的情况下发布 npm 模块?

node.js - Docker Dynamodb 错误 : Nodejs App with dynamodb does not work in docker but works without it

javascript - React Native JSX 导出导入标识符

javascript - 如何在 Javascript 的单行函数中返回值?

javascript - 使用 es6 模块制作可访问 api 的最佳方法

javascript - 在 Browserslist 中为 Babel 添加 "not dead"会产生不同的结果,即使浏览器是相同的?

javascript - 为上传到 AWS S3 的图像设置 Expires 和 Cache-Control header

javascript - Node JS CLI + Node 库

node.js - 如何检测未注册的socket.io事件?