4

任意のオブジェクトを指定して、それを 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 - EventEmitter からの継承

私はそれを正しくやっていますか?これを行うより良い方法はありますか?ありがとう。

4

2 に答える 2

2

これを行う通常の方法は、util.inheritsを使用することです(リンクされたドキュメントには、ほぼ正確に必要な例が含まれています)。

于 2012-09-26T13:03:19.843 に答える
1

問題__proto__は、コンストラクターの代わりにプロトタイプを使用していることではありません。問題は、プロトタイプの使用方法が間違っていることです。しかし、プロトタイプは必要ありません。ミックスインが必要です。Using__proto__は、ミックスインを作成する作業を回避するハックです。ミックスインが必要な場合は、プロトタイプなしで手動で行う必要があります。

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");
于 2015-04-18T20:19:14.960 に答える