Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 仅复制EventEmitter的原型是在Nodejs中继承EventEmitter的好方法_Javascript_Node.js_Constructor_Prototypal Inheritance_Eventemitter - Fatal编程技术网

Javascript 仅复制EventEmitter的原型是在Nodejs中继承EventEmitter的好方法

Javascript 仅复制EventEmitter的原型是在Nodejs中继承EventEmitter的好方法,javascript,node.js,constructor,prototypal-inheritance,eventemitter,Javascript,Node.js,Constructor,Prototypal Inheritance,Eventemitter,我一直在阅读Nodejs in practice一书,直到我看到这个例子: var EventEmitter=require('events')。EventEmitter; 功能音乐层(曲目){ this.track=轨道; 这是假的; for(EventEmitter.prototype中的var methodName){ 此[methodName]=EventEmitter.prototype[methodName]; } } 作者写道:“这个例子看起来有点做作,但有时候复制EventEm

我一直在阅读
Nodejs in practice
一书,直到我看到这个例子:

var EventEmitter=require('events')。EventEmitter;
功能音乐层(曲目){
this.track=轨道;
这是假的;
for(EventEmitter.prototype中的var methodName){
此[methodName]=EventEmitter.prototype[methodName];
}
}
作者写道:“这个例子看起来有点做作,但有时候复制EventEmitter的属性而不是以通常的方式继承它确实很有用 更类似于mixin或多重继承;请参见下面的清单中演示的内容。“。但我就是不明白

虽然这个例子很有魅力,但我还是忍不住要弄清楚这是否是一个“好的做法”是否继承Js中的类,因为作者只复制了EventEmitter类的
prototype
属性,完全忽略了EventEmitter构造函数中实例化的属性,这让我想知道,如果我错误地调用依赖于类中实例化的属性的EventEmitter方法,会发生什么EventEmitter构造函数是否要运行

假设EventEmitter的
原型
中的所有方法都是独立的,那么像作者在上面的示例中那样在Js中继承类是否是一种“良好实践”?

EventEmitter部分给出以下示例:

const EventEmitter=require('events');
类MyEmitter扩展了EventEmitter{}
const myEmitter=新的myEmitter();
MyMitter.on('event',()=>{
log('发生了事件!');
});
myEmitter.emit('event');
因此,可以肯定地说,这是推荐的方法。作者推荐的方法是一种旧方法,现在不受鼓励


似乎作者想说的是,当JavaScript中不允许多重继承时,像这样继承很好。

我不认为文档中的示例清楚我的问题,由于
不仅扩展了父类的
prototype
属性中的
关键字复制方法,它还将父类的构造函数中声明的属性实例化为继承子类的构造函数。
扩展
实际上是一种捷径,我认为这是在Js中进行继承时唯一的好做法,我在上面的问题中提到了这是预期行为和“好做法”这是最初的问题。如果您喜欢自定义行为,请随意复制原型中的所有方法。这是一个很好的实践,它不能回答我的问题。顺便说一句,谢谢你花时间回答我的问题。我很欣赏《实践中的Nodejs》一书的作者似乎对JS中的继承有点教条主义。在JS中有许多不同的继承和组合处理方法,在不同的情况下各有利弊。幸运的是,通过
类的扩展,我们现在有了一种标准化的方法。我认为手动复制EventEmitter属性唯一有帮助的方法是在一种特殊情况下,您已经从其他类(不是EventEmitter)继承,但您希望您的子类也是EventEmitter。