gpt4 book ai didi

javascript - Node.js:events.EventEmitter.call(this)与Obj.prototype.__proto__ = events.EventEmitter.prototype的关系;

转载 作者:太空宇宙 更新时间:2023-11-04 02:31:24 25 4
gpt4 key购买 nike

我正在学习 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 对象。

那么为什么我们必须复制属性两次?

谁能告诉我这些表达式有什么区别?

最佳答案

MyEmitter.prototype         = events.EventEmitter.prototype;

您刚刚为您的类指定了与 EventEmitter 相同的原型(prototype)。

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

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

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

关于javascript - Node.js:events.EventEmitter.call(this)与Obj.prototype.__proto__ = events.EventEmitter.prototype的关系;,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26386847/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com