2015-12-17 4 views
0

Я пытаюсь запрограммировать текстовую приключенческую игру с использованием 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) 

Я ничего не могу сразу неправильно с тем, что я написал, и я сделал что-то подобное в других местах в текущем коде без каких-либо проблем пятна. Я собираюсь держать себя в курсе, чтобы посмотреть, могу ли я решить проблему самостоятельно, но если у кого-то есть предложения, которые могут сэкономить мне время, это было бы очень признательно.

ответ

3

Решено, я ошибся constructor как constuctor.

+0

Я только начал снимать код в своем классе и тоже заметил опечатку - хороший улов! – wmock

+0

Спасибо. Вероятно, я должен был прочитать мой код более внимательно, прежде чем задавать вопрос. Урок выучен! –

Смежные вопросы