当前位置: 首页 > 面试题库 >

您应该如何从Node中的EventEmitter继承?

武骁
2023-03-14
问题内容

我正在阅读这篇小文章,以了解从继承的内容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?另外,他为什么将自己的constrructor的原型设置为的原型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构造函数上调用?在尝试示例时,我省略了这一行,但它们仍然有效。


问题答案:

第三个示例通常 正确:EventEmitter所有 门实例创建一个实例。

让我们想象一个简单的情况:

var Foo = function() {
    // each Foo instance has a unique id
    this.id = Math.random();
}
Foo.prototype.doFoo = function() { console.log("Foo!"); }

假设我们要创建一个Bar构造函数,该构造函数继承自Foo并添加一些新属性。如果您遵循最后一个示例:

var Bar = function() {
    this.something = 5;
}
Bar.prototype = new Foo();

这是错误的,因为所有Bar实例将具有相同的id属性。相反,我们必须为每个实例调用父构造函数:

var Bar = function() {
    Foo.call(this);  // set unique `id` on `this`
    this.something = 5;
}
Bar.prototype = Object.create(Foo.prototype);

请注意,这里的最后一行与相同,Bar.prototype.__proto__ = Foo.prototype;因为Object.create创建了一个新对象,该对象__proto__Object.create参数设置为。



 类似资料:
  • 问题内容: 我在许多Node.js库中看到了这种模式: (在这里获得) 有人可以举个例子给我解释一下,为什么这是一种常见的模式,什么时候方便? 问题答案: 就像该代码上面的注释所言,它将继承自,因此您可以使用该“类”的实例来发出和侦听事件。 例如,您现在可以执行以下操作: 更新 :正如许多用户指出的那样,在Node中执行此操作的“标准”方法是使用“ util.inherits”: 第二次更新 :随

  • 问题内容: 我正在尝试在示例应用程序中设置react-router,但出现以下错误: 我的应用程序设置如下: 父组件 子/ 组件 知道我在做什么错吗? 这是一个沙盒链接来演示该问题。 问题答案: 我假设您使用的是React-Router V4,就像您在原始Sandbox Link中 使用的一样。 您呈现在调用组件用来渲染和主要成分是外面,这就是为什么它被抛出的错误: 您不应在 外使用 变化 : 使

  • 我一直在尝试创建一个,它也有一个处理程序。我阅读了这个问题的答案并知道如何做到这一点。 我的问题只是关于它的结束部分。 1) 我知道我可以写:或,但我不会写。在这里的注释中解释了这一点,因为您需要处理参数操作。 这是否意味着由于处理程序是

  • 问题内容: 在PHP / Java中,可以做到: 并且,Super类的所有公共/受保护的方法,属性,字段等都会自动成为Sub类的一部分,如有必要,可以重写这些类。 Javascript中的等效功能是什么? 问题答案: 我已经更改了现在的操作方式,我尝试避免使用构造函数和它们的属性,但是我从2010年起的旧答案仍然是最底层的。我现在更喜欢。适用于所有现代浏览器。 我应该注意,这通常比使用函数构造函数

  • 问题内容: 我正在做的事情涉及按顺序运行(进行一些设置,然后运行调用者感兴趣的实际命令),然后进行一些清理)。 就像是: 哪里是这样的: 在内部,我使用,它返回,并且有效地将事件的结果从返回给调用者。 现在,我还需要将事件从stdout和stderr发送到调用者,这些事件也来自EventEmitters。是否有一种方法可以使(Bluebird)Promises正常工作,或者它们只是妨碍发出多个事件

  • 问题内容: 我有以下从缓冲读取器读取数据的示例: 每当缓冲读取器中出现某些情况时(在这种情况下),将执行循环中的代码。在我的情况下,如果客户端应用程序将某些内容写入套接字,则将执行循环中的代码(服务器应用程序中)。 但是我不明白它是如何工作的。等待直到缓冲读取器中出现某些内容,当其中出现某些内容时,它将返回并执行循环中的代码。但是什么时候可以退货。 还有另一个问题。上面的代码摘自一个方法,我在线程