Node.js 在我的节点示例中添加或删除EventEmitter.call(this)不会';没什么区别,为什么?

Node.js 在我的节点示例中添加或删除EventEmitter.call(this)不会';没什么区别,为什么?,node.js,Node.js,我是Node.js新手,并开始学习它 我在节点的“事件”模块中遇到了“EventEmitter” 在遵循EventEmitter文档中的示例之后,我编写了bolow代码 var EventEmitter = require("events"); var util = require("util"); var Ticker = function(){ var self = this; EventEmitter.call(self); self.start = function(){

我是Node.js新手,并开始学习它

我在节点的“事件”模块中遇到了“EventEmitter”

在遵循EventEmitter文档中的示例之后,我编写了bolow代码

var EventEmitter = require("events");
var util = require("util");

var Ticker = function(){
  var self = this;
  EventEmitter.call(self);

  self.start = function(){
    setInterval(function(){
        self.emit("tick");
    },1000);
  }

  self.on("tick",function(){
    console.log("Keep Ticking");
  });
}

util.inherits(Ticker,EventEmitter);

var ticker = new Ticker();
ticker.start();
当我运行代码时

node example03.js
输出是

rahul@ubuntu:~/rahul/NodePractise/EventEmitter$ node example03.js
Keep Ticking
Keep Ticking
Keep Ticking
Keep Ticking
^C
rahul@ubuntu:~/rahul/NodePractise/EventEmitter$
现在即使我评论这句话

//EventEmitter.call(self);
代码运行良好

那么,上面这条线的目的是什么?它的存在有多重要

那么,上面这条线的目的是什么,它的存在又是怎样的呢 重要的

代码行:

EventEmitter.call(self);
因此,每次创建派生类的新实例时,基类(继承自的)都可以正确初始化自己的实例。这是一个非常重要的步骤,不应遗漏

为了准确地解释它在做什么,
EventEmitter
是从中派生的对象的构造函数
.call(self)
告诉Javascript调用该构造函数,并将
值设置为刚创建的对象(代码中的
self
指向该对象)。这将以调用
EventEmitter
构造函数的方式结束,就像
neweventemitter()
调用它一样,这正是您想要的。这里与
neweventemitter()
的唯一区别在于,您将
this
指向派生对象的实例,而不仅仅是
EventEmitter
对象

在继承的所有情况下,都应该调用基类构造函数,以便它能够正确地初始化自身。但是,可能有一些类型的对象在构造函数中没有太多功能,因此如果忽略它,事情可能会正常工作。或者,它们可能只是看起来起作用,但今后会有问题


在我的节点示例中添加或删除EventEmitter.call(此)不会 有什么不同,为什么

如果查看,可以看到
EventEmitter
构造函数执行以下操作:

function EventEmitter() {
  EventEmitter.init.call(this);
}
EventEmitter.init = function() {
  this.domain = null;
  if (EventEmitter.usingDomains) {
    // if there is an active domain, then attach to it.
    domain = domain || require('domain');
    if (domain.active && !(this instanceof domain.Domain)) {
      this.domain = domain.active;
    }
  }

  if (!this._events || this._events === Object.getPrototypeOf(this)._events) {
    this._events = {};
    this._eventsCount = 0;
  }

  this._maxListeners = this._maxListeners || undefined;
};
并且,
.init()
方法执行以下操作:

function EventEmitter() {
  EventEmitter.init.call(this);
}
EventEmitter.init = function() {
  this.domain = null;
  if (EventEmitter.usingDomains) {
    // if there is an active domain, then attach to it.
    domain = domain || require('domain');
    if (domain.active && !(this instanceof domain.Domain)) {
      this.domain = domain.active;
    }
  }

  if (!this._events || this._events === Object.getPrototypeOf(this)._events) {
    this._events = {};
    this._eventsCount = 0;
  }

  this._maxListeners = this._maxListeners || undefined;
};
因此,如果调用父构造函数失败,EventEmitter对象中将有几个实例变量未正确初始化。这对代码的影响是任何人的猜测(需要进一步的代码研究和测试才能确定),但这不是一件好事。某些功能可能在没有此初始化的情况下工作,但其他功能很可能无法正常工作