我怎样才能"演员"一个javascript对象到子类?

时间:2016-05-03 16:36:11

标签: javascript node.js class sockets extends

我将用古代语言编写的游戏移植到javascript / node。我对服务器/客户端部分的初步计划是为服务器和客户端创建一个单独的类。对于服务器,我扩展EventEmitter,创建并存储net.Server对象作为成员变量,并在我的类上公开listen方法。

我遇到设计问题的地方是客户。 net.Socketnet.createServer函数创建并传递到我的回调中:

const server = net.createServer(socket => {
    // somehow turn socket into a Client object here
    // let client = new Client(socket); ???
});

所以我最初的想法是将此套接字作为构造函数arg传递到我的Client类中:

class Client extends EventEmitter {
    constructor(socket) {
        super();
        this._socket = socket;
    }

    // example wrapper method
    write(buff) {
        debug(/* print the buffer in hex */);
        this._socket.write(buff);
    }

    // example new method
    sendMessage(message) {
        let buff = Buffer.alloc(4 + message.length);
        buff.writeInt32LE(message.length);
        buff.write(message);
        this.write(buff);
    }        

    // other methods
}

但是我发现自己在内部套接字上写了很多包装器方法。这让我觉得我真正想要的是让Client成为net.Socket的超类。但是我必须以某种方式"演员" Server创建到我的Client类的套接字。问题是Client的构造函数设置了一些状态变量,如果我只是"施放"那么这个套接字就不会有。它到我的Client课程。

对于这种情况,是否有普遍接受的设计模式?情况是我想用尽可能最干净的新方法和状态来扩展现有对象。我一直在考虑其他选择,但我无法决定是否有更好的选择:

  • 在Client实例和内部套接字之间创建proxy
  • 使用Object.extend使用我需要的方法填充套接字对象
  • 坚持手动代理我在套接字上需要的任何方法

0 个答案:

没有答案