我正在使用 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.log
出 this
时,我得到了我的 { 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/