【问题标题】:Different ways of extending class in Javascript在 Javascript 中扩展类的不同方法
【发布时间】:2016-02-06 12:02:10
【问题描述】:

我正在阅读this article 关于在节点中扩展 EventEmitter 类的内容,其中有一小部分我不明白:

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

我查看了几篇关于这应该如何工作的文章,但真的不明白。我知道,或者,我也可以使用util.inherits,但我试图了解上面一行中发生了什么。

我也想知道这样做是否会产生与使用 __proto__ 相同的结果:

Door.prototype = Object.create(EventEmitter.prototype);
//or
Door.prototype = new EventEmitter(); // I know this also calls constructor

那么,这三种方法有什么区别,__proto__ 是如何工作的呢?

编辑:

所以我查看了发布的链接。我知道原型基本上用于构建__proto__,然后在查找链中使用它来解析方法。我链接到的文章还说,这一行将所有 EventEmitter 属性复制到门对象:

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

现在我的问题(之前可能还不清楚)是:如果上面一行的点是将 EventEmitter 的属性复制到门对象,我认为可以通过这样做来实现:

Door.prototype = new EventEmitter();

【问题讨论】:

标签: javascript node.js inheritance eventemitter


【解决方案1】:

这是关于对象可以访问什么以及为什么访问的全部内容。

我们需要了解__proto__ 与原型。 我将向您推荐这个问题和答案,以帮助您理解这两者。 __proto__ VS. prototype in JavaScript

您正在查看的代码行是一个从 EventEmitter 原型继承的构造函数。这将创建一个类似链的系统,以包含来自多个构造函数的方法。

Door.prototype.open = function(){ ... open something... };
Door.prototype.__proto__ = events.EventEmitter.prototype;
var myDoor = new Door;

对象 myDoor 将具有方法 open 以及 EventEmitter 原型中的所有方法。

【讨论】:

  • 所以如果我理解正确,使用__proto__ 我们可以在启动后更改Door.prototype。但是使用Door.prototype = Object.create(EventEmitter.prototype);不能实现同样的事情吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-03-14
  • 1970-01-01
  • 2018-02-24
  • 1970-01-01
  • 1970-01-01
  • 2011-11-13
  • 1970-01-01
相关资源
最近更新 更多