Вызов EventEmitter дважды в одном классе? - PullRequest
0 голосов
/ 18 сентября 2018

Я сейчас читаю краткое руководство на EventEmitter в NodeJS.Вот один из примеров из этого урока:

var events = require('events');

function Door(colour) {
  this.colour = colour;
  events.EventEmitter.call(this);

  this.open = function()
  {
  this.emit('open');
  }
}

Door.prototype.__proto__ = events.EventEmitter.prototype;

var frontDoor = new Door('brown');

frontDoor.on('open', function() {
    console.log('ring ring ring');
  });
frontDoor.open();

Есть кое-что, чего я не понимаю.На 5-й строке мы call EventEmitter.Если я не ошибаюсь, это позволяет нам делать такие вещи позже:

var myDoor = new Door('green');
myDoor.on('open', ...);

Так что в основном это позволяет использовать методы, принадлежащие классу EventEmitter, непосредственно из экземпляра Doorкласс, верно?

Но тогда, какова цель 13-й строки кода (Door.prototype.__proto__ = events.EventEmitter.prototype;)?Это копирует свойства EventEmitter в класс Door.Но разве это не было сделано с помощью метода call?

Я думаю, что что-то упустил ... Надеюсь, вы сможете помочь мне понять все эти вещи.

Спасибо.

1 Ответ

0 голосов
/ 18 сентября 2018

Вызов конструктора позволяет использовать родительскую функцию и заменить дочерний экземпляр на this.Это позволяет любой инициализации произойти, но не не добавляет прототип родителя в дочернюю функцию.Вот простой пример:

function Parent(name){
  this.name = name
  this.somProp = "some prop for " + name
}

Parent.prototype.test = function(){
  console.log(this.name, "testing")
}

// use Parent:

let p = new Parent("parent instance")
p.test()


function Child(name){
  // call parent constructor puts `.somProp` on your instance
  Parent.call(this, name)
}

let c = new Child("C")
// child instance has somProp because we called the parent constructor
console.log(c)

// BUT THIS IS AN ERROR //
// becuase it doesn't inherit the prototype //

c.test()

Установив свойство __proto__ для прототипа родительской функции, теперь вы можете получить доступ к функциям прототипа родительского объекта:

function Parent(name){
  this.name = name
  this.somProp = "some prop for " + name
}

Parent.prototype.test = function(){
  console.log(this.name, "testing")
}

function Child(name){
  Parent.call(this, name)
}
Child.prototype.__proto__  = Parent.prototype

let c = new Child("C")
c.test()  // now this works

Что не совсем понятно, так это то, что нужно что-то инициализировать в конструкторе EventEmitter.Если вы посмотрите документы, вы увидите, что эмитент устанавливает this в экземпляр EventEmitter при вызове функции.Таким образом, вы можете увидеть разницу между экземплярами, когда вы инициализируете экземпляр с call, а когда нет.Например, если у вас нет call суперкласса, у вашего экземпляра не будет _maxListeners, который вы, вероятно, хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...