【问题标题】:node.js cloning eventemitter objectnode.js 克隆事件发射器对象
【发布时间】:2018-05-11 14:23:45
【问题描述】:

我有一个游戏

game = {
  turn: 5,
  players : []
}

game.events = new events.emitter()
game.events.on('attack', handleAttack)

我需要将游戏状态准确地克隆(深度)到另一个对象,以便我可以为 AI 运行游戏模拟。我将如何克隆事件对象?

【问题讨论】:

  • 你反对使用图书馆吗? Lodash 提供了一个很棒的方法,称为 _.cloneDeep,它可以对对象进行深度克隆
  • 状态是否也参与了事件?如果事件是无状态的,那么您可以克隆对象的属性,但它们都可以共享一个公共事件。
  • @VincentRamdhanie state 参与是。
  • @SterlingArcher 我正在使用 lodash,但它不适用于函数。
  • 问题是,为什么将状态存储在您的函数中?是否可以重构使函数是无状态的,那么这将成为一个微不足道的问题。

标签: javascript node.js event-handling


【解决方案1】:

正如 cmets 中所指出的,不要在函数中包含状态,这使得复制函数变得不必要。

这是一个相当简单的例子。

const EventEmitter = require('events');

class Game {
  constructor(name, turn) {
    this.turn  = turn;
    this.name = name;
    this.events = new EventEmitter();
    this.events.on('attack', () => {
      console.log(`${this.name} is attacking`);
    })
  }

  clone(){
    const copy = new Game(this.name, this.turn);
    //clone the other properties
    return copy;
  }

}


const g1 = new Game("One", 5);
const g2 = new Game("Two", 4);

g1.events.emit('attack');
g2.events.emit('attack');

const g3 = g1.clone();
g3.events.emit('attack');

您必须特别注意克隆属性本身,但请注意 g3 只是 g1 的副本。希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    相关资源
    最近更新 更多