Я пытаюсь запрограммировать текстовую приключенческую игру с использованием ECMAScript 6, транслируя в ECMAScript 5 с помощью Babel. Я столкнулся с странным случаем, который не появляется в другом месте моего кода.Super Class Property Undefined Несмотря на вызов Super Call
У меня есть общий класс действий, который анализирует команды, определяет, соответствует ли данный вход команде, которая запускает действие, а затем вызывает функцию для фактического выполнения действия.
/**
* An action represents a mapping between a string and some kind of action in
* the system.
*/
export class Action {
/**
* Construct a new action instance.
*/
constuctor() {
this.commands = [];
}
/**
* Add a command as a trigger for this action.
*
* @param {String} command The command string to add as a trigger.
*
* @returns {Boolean} True if the command was added, false otherwise.
*/
addCommand (command) {
var paramRegex = /\{([a-zA-Z0-9_]+)\}/g;
var i = 0;
var regexResult;
var commandRegex;
var parameters;
if (typeof command !== 'string' || command.length < 1) {
return false;
}
parameters = {};
// Make spaces generic
commandRegex = command.replace(/\w+/g, '\\w+');
regexResult = paramRegex.exec(commandRegex);
while (regexResult) {
parameters[i] = regexResult[1];
commandRegex = commandRegex.replace(regexResult[0], '([^\\w]+)');
i++;
regexResult = paramRegex.exec(commandRegex);
}
this.commands.push({
regex: new RegExp(commandRegex, 'gi'),
parameters: parameters
});
return true;
}
/**
* Determine if the action has a trigger matching the given command string.
*
* @param {String} command The command to parse.
*
* @returns {Boolean} True if the command triggers the action, false
* otherwise.
*/
isTrigger (command) {
var i;
for (i = 0; i < this.commands.length; i++) {
if (this.commands[i].regex.test(command)) {
return true;
}
}
return false;
}
/**
* Trigger the action using the given command. This method checks if the
* command is a trigger for the action, extracts any arguments from the
* command string, and passes them to the {@link Action#execute} function
* using {@link Function#apply}.
*
* @param {String} command The command to use to trigger the action.
*
* @returns {Boolean} True if the trigger was successful, false otherwise.
*/
trigger (command) {
var args;
var result;
var i;
for (i = 0; i < this.commands.length; i++) {
result = this.commands[i].regex.exec(command);
if (result != null) {
break;
}
}
if (result == null) {
return false;
}
args = [];
for (i = 1; i < result.length; i++) {
args.push(result[i]);
}
this.execute.apply(this, args);
}
/**
* Execute the action with the given arguments.
*
* @returns {Boolean} True if the execution was successful, false otherwise.
*
* @virtual
*/
execute() {
throw new Error('Not implemented');
}
}
У меня есть подкласс, который должен реализовывать движение и перемещать игрока из одного места в другое.
/**
* An action that moves the player.
*
* @extends {Action}
*/
export class MoveAction extends Action {
constructor() {
super();
this.addCommand('go to {place}');
this.addCommand('move to {place}');
this.addCommand('go {place}');
}
execute (place) {
var loc = GameObject.getGameObject(place);
if (!loc) {
return false;
}
return player.setLocation(loc);
}
}
Я бежал Бабель на моем коде, чтобы производить совместимые ECMAScript 5 кода и попытался запустить их вручную с помощью Node.js для проверки их работы, прежде чем я толкаю их в моем репозиторий Git (я планирую написать тест случаи позже).
Я столкнулся с проблемой, хотя Node.JS жалуется, что this.commands
не определен.
> var MoveAction = require('./compiled/actions/moveAction').MoveAction;
undefined
> var act = new MoveAction();
TypeError: Cannot read property 'push' of undefined
at MoveAction.addCommand (compiled\action.js:64:26)
at new MoveAction (compiled\actions\moveAction.js:41:39)
at repl:1:11
at REPLServer.defaultEval (repl.js:248:27)
at bound (domain.js:280:14)
at REPLServer.runBound [as eval] (domain.js:293:12)
at REPLServer.<anonymous> (repl.js:412:12)
at emitOne (events.js:82:20)
at REPLServer.emit (events.js:169:7)
at REPLServer.Interface._onLine (readline.js:210:10)
Я ничего не могу сразу неправильно с тем, что я написал, и я сделал что-то подобное в других местах в текущем коде без каких-либо проблем пятна. Я собираюсь держать себя в курсе, чтобы посмотреть, могу ли я решить проблему самостоятельно, но если у кого-то есть предложения, которые могут сэкономить мне время, это было бы очень признательно.
Я только начал снимать код в своем классе и тоже заметил опечатку - хороший улов! – wmock
Спасибо. Вероятно, я должен был прочитать мой код более внимательно, прежде чем задавать вопрос. Урок выучен! –