我正在学习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对象。
那么为什么我们要两次复制属性呢?
有人能告诉我这些表达方式之间有什么区别吗?
答案 0 :(得分:0)
MyEmitter.prototype = events.EventEmitter.prototype;
您刚刚为您的班级分配了与EventEmitter
相同的原型。
这意味着您添加到原型中的任何内容实际上都会添加到EventEmitted.prototype
。
这是一个非常糟糕的主意。
正确的解决方案是调用Object.create()
创建一个继承其原型的新对象,正如我在my blog中解释的那样。