我正在编写一个简单的文字游戏来练习我的javascript(我是新手),使用NPM包prompt
(https://www.npmjs.com/package/prompt)在我需要时查询用户一个回应。
由于我来自OOP背景(在其他语言中),我一直在尝试在不同对象中封装不同的功能。所以我在一个对象中有所有prompt
相关代码,比如这个
function Prompter() {
this.getUserName = function (callback) {
var schema = {
properties: {
name: {
description: "Tu nombre por favor:",
pattern: /^[ñÑa-zA-Z\s\-]+$/,
message: 'Solo letras, por favor',
required: true
}
}
};
prompt.get(schema, callback);
};
}
和像这样的另一个对象中的游戏逻辑(这是代码的相关部分)
function Game() {
this.qGenerator = null;
this.prompter = null;
this.user = "";
this.doNextRound = function () {
//// omitted for brevity
};
this.init = function () {
this.qGenerator = new QuestionGenerator();
this.prompter = new Prompter();
};
this.startGame = function () {
this.prompter.getUserName(this.storeUserName);
};
this.storeUserName = function (err, result) {
if (err) {
this.handleErr(err);
return;
}
this.user = result.name;
this.doNextRound();
};
}
我就像这样开始游戏
const game = new Game();
game.init();
game.startGame();
我遇到的问题是Game
方法storeUserName
,我已将其作为prompt
的回调传递,我无法访问Game
}通过this
对象,因此,当我调用
this.doNextRound
在storeUserName
里面我得到了
TypeError: this.doNextRound is not a function
我理解为什么,因为this
引用了回调中的Node。但我不知道如何在我作为回调传递的方法中保留对正确this
的引用。我了解如何在更多'香草' Javascript - 使用that = this
或apply
等,但我不确定在Node回调中处理this
的最佳方式是当你传递另一个时对象的方法。任何建议都非常感激。
答案 0 :(得分:1)
this.prompter.getUserName(this.storeUserName.bind(this));
this.prompter.getUserName( _ => this.storeUserName() );
其中任何一个都可以。