将多个Javascript对象合并为一个。Stream.call(这个)做什么?

将多个Javascript对象合并为一个。Stream.call(这个)做什么?,javascript,node.js,node-streams,Javascript,Node.js,Node Streams,我正在研究NodeJS流代码和以下示例: 当我进入newreadable()调用时,我看到的代码如下所示: const Stream = require('stream'); function Readable(options) { // ... Stream.call(this); } 流式调用(this)做什么?我以前从未见过这样的代码 我知道Javascript Object.call()方法的功能,并且通常在另一个函数中看到它 myObj.myFunc.call(thi

我正在研究NodeJS流代码和以下示例:

当我进入
newreadable()
调用时,我看到的代码如下所示:

const Stream = require('stream');

function Readable(options) {
   // ... 
   Stream.call(this);
}
流式调用(this)做什么?我以前从未见过这样的代码

我知道Javascript Object.call()方法的功能,并且通常在另一个函数中看到它

myObj.myFunc.call(this);
我阅读了MDN,示例代码将两个对象组合在一起

因此,我认为调用
Stream.call(this)
后的
Readable
对象具有所有流函数和字段值。

这是正确的吗?

我猜这就是Javascript实现类似继承的功能的方式,但没有继承。我认为这实际上相当于合并多个Javascript对象

为了证明我的理解,我写了一个函数,其中显示了三个函数fun1、fun2和fun3,并让MyMultiObj调用它们,如下所示:

function MyMultiObj() {
   fun1.call(this);
   fun2.call(this);
   fun3.call(this);
}

let myMulti = new MyMultiObj();
在此代码中,
myMulti
对象具有4个函数MyMultiObj、fun1、fun2和fun3的所有功能和字段

我还注意到,通过原型化定义的函数(例如,
fun2.prototype.really2()
没有合并/可用,这是有道理的,因为这种方法不使用原型化)

我认为这很酷,可以看到好处,但我想

  • (a) 验证我的理解是否正确。。。调用
    Stream.call(this)
    后的
    Readable
    对象具有所有流函数和字段值,并且

  • (b) 找出为什么这样做而不是典型的原型/继承(如果有原因的话)

使用
call()
只执行一个函数,其中
这个
是传递给它的对象,在构造函数内部,它就像其他语言(和ES6)中的
super()
调用:

等于:

 class Stream {
  constructor() {
     this.something = 1;
 }
}

class Stream extends Readable {
 constructor() {
  super(); // <<
 }
}
类流{
构造函数(){
这个东西=1;
}
}
类流扩展了可读性{
构造函数(){

super();//它正在调用父构造函数。
Readable
继承自
,因此它将其原型设置为继承自
的原型,并进行此调用以初始化自身。对于ES6类,它看起来像
类Readable扩展流{constructor(){super();}
(尽管您可以省略一个
构造函数()
,如果它只调用
super()
)@Ry,我认为它实际上不是父构造函数,因为它没有使用
类扩展
Stream.prototype.func2
,对吗?我确实同意它在概念上与您描述的类似。它说的是将此函数附加到我自己(我的
).不,它实际上只是一种常规继承,以最令人困惑的方式编写,因为文件到处都是。这里是原型设置的地方:我相信它与继承相似,但并不完全相同,因为它确实是将多个对象合并为一个。你同意我的观点吗?@pats-yup,虽然有只有一个对象。是的。我应该说,一个对象具有其他函数添加到它的功能(带字段的函数)。从概念上讲,如果每个函数fun1、fun2、fun3表示三种对象的构造函数,那么
fun1.call(this)
使当前对象现在具有
fun1()的功能
构造函数添加。
 function Stream() {
   this.something = 1;
 }

 function Readable () {
   Stream.call(this);
 }

 (new Readable()).something // 1
 class Stream {
  constructor() {
     this.something = 1;
 }
}

class Stream extends Readable {
 constructor() {
  super(); // <<
 }
}