Node.js:events.EventEmitter.call(this)和Obj.prototype .__ proto__ = events.EventEmitter.prototype;

时间:2014-10-15 15:52:53

标签: javascript node.js function-prototypes

我正在学习Node.js并且对定制的EventEmitter有些困惑。 这是代码:

var events = require("events");
function MyEmitter (name){
        this.name = name;
//      events.EventEmitter.call(this);
        this.emitEvent = function(){
                this.emit("Event1");
        }
}
//MyEmitter.prototype.__proto__ = events.EventEmitter.prototype;
MyEmitter.prototype         = events.EventEmitter.prototype;

function foo(){
        console.log("callback: " + this.name);
}

var obj = new MyEmitter("MyEmitter");
obj.on("Event1", foo);
obj.emitEvent();

从EventEmitter继承了两条相似的行;

//MyEmitter.prototype.__proto__ = events.EventEmitter.prototype;
    MyEmitter.prototype         = events.EventEmitter.prototype;

这两个表达式似乎都有效。 我从这里看到“ proto 属性已被弃用”:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/proto

此外,如果我注释掉

//      events.EventEmitter.call(this);

代码也可以。

我听说call()用作EventEmitter的构造函数,

//MyEmitter.prototype.__proto__ = events.EventEmitter.prototype;

此行用于将所有EventEmitter属性复制到Door对象。

那么为什么我们要两次复制属性呢?

有人能告诉我这些表达方式之间有什么区别吗?

1 个答案:

答案 0 :(得分:0)

MyEmitter.prototype         = events.EventEmitter.prototype;

您刚刚为您的班级分配了与EventEmitter相同的原型。

这意味着您添加到原型中的任何内容实际上都会添加到EventEmitted.prototype

这是一个非常糟糕的主意。

正确的解决方案是调用Object.create()创建一个继承其原型的新对象,正如我在my blog中解释的那样。