Как вы должны наследовать от EventEmitter в узле?

Я перечитывалэта маленькая статья понять наследование отEventEmitter, но я немного запутался.

Он делает это:

function Door() {
    events.EventEmitter.call(this);
    this.open = function() {
        this.emit('open');
    };
}
Door.prototype.__proto__ = events.EventEmitter.prototype;

https://gist.github.com/chevex/7646362

Почему он вручную вызывает конструктор EventEmitter со своим собственным конструкторомthis? Кроме того, почему он установил прототип прототипа своего подрядчика на прототипEventEmitter? Это очень запутанно для меня.

Тогда кто-то в комментариях предложил сделать это вместо этого, что казалось более элегантным:

function Door() {
    events.EventEmitter.call(this);
    this.open = function () {
      this.emit('open');
    }
}
util.inherits(Door, events.EventEmitter);

https://gist.github.com/chevex/7646447

Это кажется НАМНОГО чище, чем другой путь, хотя, вероятно, это только потому, что я не понимаю, что происходит в первую очередь. Я не удивлюсь, еслиutil.inherits делает то же самое, что и в первом примере.

Второй, по крайней мере, имеет для меня немного смысла, но я до сих пор не понимаю, почему они просто не делают этого:

function Door() {
    this.open = function () {
      this.emit('open');
    }
}
Door.prototype = new events.EventEmitter();

https://gist.github.com/chevex/7646524

Может кто-нибудь объяснить мне, в чем различия между всеми этими подходами и почему в первых двух они вызывают.call(this) наEventEmitter конструктор? Я пропустил эту строку, когда пробовал примеры, и они все еще работали.

Ответы на вопрос(4)

Ваш ответ на вопрос