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

Merging multiple Javascript objects into one. What does Stream.call(this) do?

我正在研究 NodeJS Stream 代码和这个示例 Streams article:

const { Readable } = require('stream');

const inStream = new Readable({
  read() {}
});

inStream.push('ABCDEFGHIJKLM');
inStream.push('NOPQRSTUVWXYZ');

inStream.push(null); // No more data

inStream.pipe(process.stdout);

当我进入 new Readable() 调用时,我看到如下代码:

const Stream = require('stream');

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

Stream.call(this) 是做什么的? 我以前没见过这样的代码。

我知道 Javascript Object.call() 方法的作用,并且通常在其他函数中见过它。

myObj.myFunc.call(this);

我阅读了 MDN https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call,示例代码将两个对象组合在一起。

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

这是正确的吗?

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

所以为了证明我的理解,我写了一个JSFiddle code example,其中显示了三个函数 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() 不是 merged/available,这是有道理的,因为这种方法没有使用原型)。

我觉得这个挺爽的,能看到好处,但是想

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

 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(); // <<
 }
}

So my belief is that the Readable object after calling Stream.call(this) has all of the Stream functions and field values.

仅在构造函数中直接设置的。它没有values/methods的原型