【问题标题】:What is the difference between these two constructor patterns?这两种构造函数模式有什么区别?
【发布时间】:2014-05-12 13:13:05
【问题描述】:
Function ConstrA () {
    EventEmitter.call(this);
}
util.inherits(ConstrA, EventEmitter);

Function ConstrA() {}
util.inherits(ConstrA, EventEmitter);

EventEmitter.call(this) 有什么需要做的吗?

【问题讨论】:

    标签: javascript node.js constructor eventemitter


    【解决方案1】:

    EventEmitter.call(this) 有什么需要做的吗?

    Apparently,是的:

    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;
        }
      }
      this._events = this._events || {};
      this._maxListeners = this._maxListeners || undefined;
    };
    

    由于所有使用 ._events 的方法都会检查其是否存在,因此如果您确实省略了调用,我预计不会有太大的中断,但我不确定这在未来是否成立。

    有足够多的其他构造函数不允许被省略,因此在构造实例时总是调用构造函数是一种很好的做法。

    【讨论】:

    • 所以emit和on/once函数仍然可以工作,而这个EventEmitter构造函数调用主要是为了将来的扩展?我确实看到了 init 的域部分,但作为新手还不明白这一点。只是想了解为什么我需要在原型中包含所有发出和 on/once 函数时调用构造函数。
    • 一般来说,因为每个新实例都可能需要初始化——这就是构造函数的用途。打电话给他们绝对是一个好习惯。快速浏览一下代码 EventEmitters 可能会正常工作,但我不建议省略它。
    • 好的,我可以理解其中的良好实践部分。所以我最初认为它不是必需的是正确的,但是在我的构造函数中调用构造函数是一个好习惯,因为除非你查看代码,否则可能存在不明显的原因?
    • @Bergi 说了什么。如果要确保 EventEmitter 构造正确,请确保调用构造函数。不这样做充其量是不受支持的。
    • 如果您想访问EventEmitter 的部分而不创建它的整个实例(使用构造函数),那么您应该对代码有足够的了解,以了解您为什么以及如何这样做。我可以理解为什么可能有这样做的理由,但你应该要求一个肯定的理由来省略它,而不是要求一个肯定的理由来做。
    【解决方案2】:

    util.inherits 获取了整个父原型,但是你失去了构造函数。因此,继承构造函数通常会以当前this 作为上下文调用父构造函数,就像您在第一个示例中看到的那样。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-17
      • 1970-01-01
      • 2020-01-09
      • 1970-01-01
      相关资源
      最近更新 更多