2015-03-01 2 views
0

У меня есть проблема с этим простым прототипирования:JS прототипирования Невозможно установить свойство «moveRight» неопределенных

Game = function (moduleConfig, gameConfig) { 
    this.moduleConfig = moduleConfig; 
    this.gameConfig = gameConfig; 

    // Game-Commands 
    this.keyCommands = { 
     moveLeft: false, 
     moveRight: false 
    }; 

    this.catcher = null; 
    this.stage = null; 
    return this; 
} 

/** 
* Left arrow down 
*/ 
Game.prototype.onKeyboardLeftDown = function() { 
    this.keyCommands.moveLeft = true; 
} 

/** 
* Left arrow up 
*/ 
Game.prototype.onKeyboardLeftUp = function() { 
    this.keyCommands.moveLeft = false; 
} 

Я всегда получаю сообщение об ошибке: Uncaught TypeError: Cannot set property 'moveRight' of undefined при вызове onKeyboardLeftDown и onKeyboardLeftUp. Но я объявил moveLeft в конструкторе объекта keyCommands.

Оба метода были названы по ключевым вниз и ключевых вверх событий:

Game.prototype.init = function() { 

    // ... 

    // ========================================================================= 
    // Set keyboard 
    KeyboardJS.on('left', this.onKeyboardLeftDown, this.onKeyboardLeftUp); 
    KeyboardJS.on('right', this.onKeyboardRightDown, this.onKeyboardRightUp); 
    // ========================================================================= 
}; 

Мой index.html выглядит следующим образом:

<!DOCTYPE html> 
<html> 
<head> 
    <title>pixi.js example 1</title> 
    <style> 
     body { 
      margin: 0; 
      padding: 0; 
      background-color: #000000; 
     } 
    </style> 
    <script src="js/pixi.dev.js"></script> 
    <script src="js/keyboard.js"></script> 
    <script src="js/moduleConfig.js"></script> 
    <script src="js/moduleResult.js"></script> 
    <script src="js/game.js"></script> 
</head> 
<body style="background-color: #EEEEEE"> 
    <script> 

     var game = new Game(moduleConfig, { 
      screenWidth: (window.innerWidth - 10), 
      screenHeight: (window.innerHeight - 10), 
      bgColor: 0xEEEEEE 
     }); 

     game.init(); 
    </script> 

</body> 
</html> 

Видит ли кто-нибудь провал? Я много искал, но я очень смущен (обычно я разрабатываю только в C# ...)

+0

Мое предположение: «это» связано с окном? – marko

+0

Почему это связано с окном? – BendEg

+0

Ваша переписка неверна –

ответ

1

Вы являетесь обязательным.

// Set keyboard 
KeyboardJS.on('left', this.onKeyboardLeftDown, this.onKeyboardLeftUp); 

this.onKeyboardLeftDown и this.onKeyboardLeftUp называются без правильного контекста

, чтобы исправить это сделать что-то вроде:

KeyboardJS.on('left', this.onKeyboardLeftDown.bind(Game), this.onKeyboardLeftUp.bind(Game)); 

Я бы не рекомендовал использовать привязку() - для совместимости браузера, но вы можете используйте что-то вроде привязки lodash или связующего «эмулятора» как:

function bind(fn, ctx) { 
    return function bound() { 
     return fn.apply(ctx, arguments); 
    }; 
} 

Другой способ:

var self = this; 
KeyboardJS.on('left', 
    function(){self.onKeyboardLeftDown()}, 
    function(){self.onKeyboardLeftUp()} 
); 
+0

Спасибо, что альтернатива связывать, если это не рекомендуется? – BendEg

+0

ну, я бы избегал любого из них и выполнял анонимную функцию, которая бы вызывала эту функцию как самый быстрый способ, но библиотеки вроде lodash или просто искали эмулятор bind –

+0

Вы можете (однако) связать это с этой вещью: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call – marko

0

Ваш вопрос не заполнен, я не вижу соответствующего кода, где вы пытаетесь определить moveRight.

Возможные проблемы:

  • вы, возможно, опечатка, что keyCommands пишется именно
  • вы можете обратиться к keyCommands за его рамки
  • вы можете обратиться к keyCommands.moveRight перед тем keyCommands инициализируется
  • вы можете присвоить другое значение keyCommands, прежде чем обращаться к moveRight
+0

Хмм, keyCommands/moveRight определяется в ctor. Или это неправильно? Я попытался поместить все команды в простой объект json. – BendEg

+0

Можете ли вы console.log (keyCommands) непосредственно перед его использованием? Не определено? Тогда он еще не был инициализирован. Вы должны убедиться, что когда вы его используете, он уже существует. –

+0

Если я использую 'console.log (this.keyCommands);', он возвращает undefined. Но поэтому контекст кажется неправильным. – BendEg

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