【问题标题】:Mixin EventEmitter methods using __proto__使用 __proto__ 的 Mixin EventEmitter 方法
【发布时间】:2012-09-17 20:11:13
【问题描述】:

给定一个任意对象,我想让它成为一个 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 - inheriting from EventEmitter

我做得对吗?你有更好的方法吗?谢谢。

【问题讨论】:

    标签: node.js events eventemitter


    【解决方案1】:

    执行此操作的常用方法是使用util.inherits(链接文档包含一个几乎正是您想要的示例)。

    【讨论】:

    • 但我没有使用构造函数
    【解决方案2】:

    __proto__ 的问题不在于您使用的是原型而不是构造函数。问题是使用原型的方法是错误的。但是你不想要原型。你想要一个mixin。使用__proto__ 是一种避免创建mixin 工作的hack。如果你想要一个 mixin,你必须手动完成,没有原型。

    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");
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多