Я разрабатываю карточную игру с использованием 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
Невозможно использовать свойства и методы объекта, переданного в качестве аргумента функции обработчика событий Phaser [ ⇐ Javascript
Форум по Javascript
1772692085
Anonymous
Я разрабатываю карточную игру с использованием Phaser и столкнулся с действительно странным поведением.
Я использую встроенный объект Phaser EventEmitter для обработки некоторых эффектов карты.
Пример EventEmitter:
const eventEmitter = new Phaser.Events.EventEmitter();
eventEmitter.on('event-name', (...args) => {
...
});
eventEmitter.emit('event-name', arg1, arg2);
Когда я передаю объект в качестве аргумента функции eventHandler и когда я пытаюсь прочитать любое свойство этого объекта с использованием точечной записи, результат не определен. Когда я пытаюсь вызвать метод из этого объекта, он выдает исключение [b]"obj.func не является функцией"[/b], но когда я регистрирую этот объект в консоли, он печатает объект со всеми свойствами и методами.
Я могу найти обходной путь этой проблемы, но я хочу понять, почему это происходит.
Что здесь происходит?
Код:
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)
Подробнее здесь: [url]https://stackoverflow.com/questions/79901293/cant-use-properties-and-methods-from-the-object-passed-as-an-argument-to-the-ph[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия