Невозможно использовать свойства и методы объекта, переданного в качестве аргумента функции обработчика событий Phaser [Javascript

Форум по Javascript
Ответить
Anonymous
 Невозможно использовать свойства и методы объекта, переданного в качестве аргумента функции обработчика событий Phaser [

Сообщение Anonymous »

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

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Javascript»