首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将多个Javascript对象合并为一个。Stream.call(这)是做什么的?

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

Stack Overflow用户
提问于 2018-10-29 05:24:01
回答 1查看 259关注 0票数 0

我正在研究这个Streams article中的NodeJS流代码和这个示例

代码语言:javascript
复制
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()调用时,我看到的代码如下所示:

代码语言:javascript
复制
const Stream = require('stream');

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

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

我知道Javascript Object.call()方法是做什么的,通常在另一个函数中见过它。

代码语言:javascript
复制
myObj.myFunc.call(this);

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

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

这样正确吗?

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

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

代码语言:javascript
复制
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)找出为什么要这样做,而不是典型的原型/继承(如果有原因)。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-29 05:29:47

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

代码语言:javascript
复制
 function Stream() {
   this.something = 1;
 }

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

 (new Readable()).something // 1

等于:

代码语言:javascript
复制
 class Stream {
  constructor() {
     this.something = 1;
 }
}

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

所以我相信调用Stream.call(

)之后的可读对象拥有所有的流函数和字段值。

只有那些直接在构造函数中设置的。它没有原型的值/方法

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53036208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档