在Javascript中扩展类的不同方法

时间:2016-02-06 12:02:10

标签: javascript node.js inheritance eventemitter

我在扩展节点中的EventEmitter类时正在阅读this article,而且有一小部分我不明白:

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();

1 个答案:

答案 0 :(得分:0)

这完全取决于哪些对象可以访问以及为什么。

我们需要了解__proto__ vs原型。 我会推荐你​​这个问题和答案,以帮助你理解这两个问题。 __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原型中的所有方法。