1

我想知道将“新”类附加到现有实例的最佳方法是什么。

例如:我有一个“worker”类,它需要“扩展”到现有的 IPC 类实例,因此它可以通过 ipc 通道进行通信。

class Worker {
    constructor(ipc) {
        this.__proto__ = ipc;
        this.__proto__.constructor = Worker;
    }
}

然后我可以像这样使用它:

const worker = new Worker(myCurrentIpc);
worker.send('blabla') /* Calls super instance ipc method */

这是不好的做法,因为它会降低性能.. https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf

在这种情况下,“发送”方法将被调用数百万次。

所以在这样的用例中,你会推荐什么?

我还可以在 Worker 实例中再次创建每个函数,然后在该方法中调用 ipc.func() ,但这也感觉像是一种反模式。

谢谢

澄清:

我有一个“主机”工作人员(主)..它有一个已经初始化的 IPC(节点-ipc)实例..

每当我创建一个工人“孩子”时,我想使用(已经存在的)父 IPC 实例来连接到子工人..

所以真的很好,当我创建一个新的 Worker({ipc:ipc}) 时,我可以将 worker.prototype 附加到 IPC 实例。因此我可以只做 worker.send() 和 IPC 实例知道它来自 main->child 频道..

4

3 回答 3

2

如果您真的想使用 访问ipc方法worker.theIpcMethod,可以使用“类工厂”,这是一个创建扩展特定值的类的函数:

function WorkerClassFactory(ipc) {
    return class Worker extends ipc {
        //contents of Worker class here
    }
}

然后创建一个具体的Worker类或给定的 IPC:

let Worker = WorkerClassFactory(myIpcInstance);

//then somewhere
let worker_instance = new Worker();
worker_instance.doStuff();

当然,您可以创建一次并在整个程序中实例化它,这样您就可以获得一致的instanceof行为。


但!这是一件非常奇怪的事情,我真的建议简单地公开一个只读属性并从那里使用它,或者甚至只是将 IPC 接口包装成更易于使用的东西(如果你的类只是公开 IPC 的方法,为什么不直接使用IPC?)。

class Worker {
    constructor(ipc) {
        this._ipc = ipc;
    }

    get ipc() {
        return this._ipc;
    }
}

new Worker(ipc).ipc.send("asdasdasd");
于 2016-10-01T11:42:14.747 回答
2

正如已经提到的,组合优于继承原则就是这种情况。Worker 对象应该将ipc实例保留为私有属性,并在它应该公开其中一些方法时包装其方法:

class Worker {
  constructor(ipc) {
    this.ipc = ipc;
  }

  send(...args) {
    return this.ipc.send(...args);
  }
}
于 2016-10-01T15:10:43.723 回答
1

我的错,我不明白这个问题。

这可能是您正在寻找的更多内容。

在这里,我们将IPC对象解耦并将其传递给Worker构造函数,然后从实例中简单地委托给 IPC 单例。

正如评论所说,不需要使用类。

// here is a singleton with a single static method. using class in not really
// neccasary here, you could just use an object with a single propery
class IPC {
  static send(val) {
    console.log('IPC::send', val)
  }
}

class Worker {
  // constructor takes the ipc as a variable and saves it to itself
  constructor(ipc) {
    this.ipc = ipc
  }
  // the send method simply calls the ipc send function
  send(val) {
    this.ipc.send(val)
  }
}

// create a new worker
const worker = new Worker(IPC);

worker.send('blabla')

于 2016-10-01T11:22:43.120 回答