Вызов конструктора позволяет использовать родительскую функцию и заменить дочерний экземпляр на 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
, который вы, вероятно, хотите.