Я разрабатываю карточную игру с использованием Phaser и столкнулся с действительно странным поведением.
Я использую встроенный объект Phaser EventEmitter для обработки некоторых эффектов карты.
Пример EventEmitter:
const eventEmitter = new Phaser.Events.EventEmitter();
eventEmitter.on('event-name', (...args) => {
...
});
eventEmitter.emit('event-name', arg1, arg2);
Когда я передаю объект в качестве аргумента функции eventHandler и когда я пытаюсь прочитать любое свойство этого объекта с использованием точечной записи, результат не определен. Когда я пытаюсь вызвать метод из этого объекта, он выдает исключение "obj.func не является функцией", но когда я регистрирую этот объект в консоли, он печатает объект со всеми свойствами и методами.
Я могу найти обходной путь этой проблемы, но я хочу понять, почему это происходит.
Что здесь происходит?
Код:
import Phaser from "phaser";
enum Events {
TEST = "TEST",
}
class EventsHandler {
private eventEmitter = new Phaser.Events.EventEmitter();
public on(event: Events, fn: (...args: any[]) => void) {
this.eventEmitter.on(event, fn);
}
public off(event: Events, fn: (...args: any[]) => void) {
this.eventEmitter.off(event, fn);
}
public emitEvent(event: Events, ...args: any[]) {
this.eventEmitter.emit(event, args);
}
}
export class Game extends Phaser.Scene {
eventsHandler: EventsHandler = new EventsHandler();
constructor() {
super("Game");
}
create() {
const testEventListener = (...args: any[]) => {
console.log(args[0]);
//prints object with all the properties and methods
console.log(args[0].testProperty);
//prints undefined
console.log(args[0].sayHello());
//throws an exception "args[0].sayHello is not a function"
};
this.eventsHandler.on(Events.TEST, testEventListener);
const testObj = {
sayHello: () => console.log("hello"),
testProperty: "hello",
};
this.eventsHandler.emitEvent(Events.TEST, testObj);
}
}
Исключение:
Uncaught TypeError: args[0].sayHello is not a function
at EventEmitter2.testEventListener (Game.ts:34:27)
at EventEmitter2.emit (phaser.js:198:35)
at EventsHandler.emitEvent (Game.ts:19:23)
at Game.create (Game.ts:42:24)
Подробнее здесь: https://stackoverflow.com/questions/799 ... -to-the-ph