用__proto__混合EventEmitter方法

给定一个任意的对象,我想使它成为一个EventEmitter:

var obj = {} // mixin eventemitter obj.on('event', ...) obj.emit('event') 

另外,当我键入obj时,我不希望它显示EventEmitter方法作为方法。 例如通过CLI:

 > obj {} 

因此,现在我正在做:

 function mixinEventEmitter(obj) { obj.__proto__ = EventEmitter.prototype return obj } 

但是人们说使用__proto__是一个反模式: Node.js – 从EventEmitterinheritance

我做得对吗? 你有更好的方式来做到这一点? 谢谢。

通常的做法是使用util.inherits (链接的文档包含一个几乎完全符合您需要的示例)。

__proto__的问题不是你正在使用原型而不是构造函数。 问题是这是使用原型的错误方法。 但是你不想要一个原型。 你想要一个混合。 使用__proto__是一种避免创build混入的工作。 如果你想要一个混合,你必须手动,没有原型。

 var EventEmitter = require("events").EventEmitter, obj = {}; function emitter(obj) { // copy EventEmitter prototype to obj, but make properties // non-enumerable for (var prop in EventEmitter.prototype) { Object.defineProperty(obj, prop, { configurable: true, writable: true, value: EventEmitter.prototype[prop] }); } // also, make sure the following properties are hidden // before the constructor adds them ["domain", "_events", "_maxListeners"].forEach(function(prop) { Object.defineProperty(obj, prop, { configurable: true, writable: true, value: undefined }); }); // call EventEmitter constructor on obj EventEmitter.call(obj); // return the obj, which should now function as EventEmitter return obj; } emitter(obj); obj.on("event", console.log.bind(console)); obj.emit("event", "foo");